lua - (Lua) 对非数值进行数学运算

标签 lua

我想为 Lua 制作某种 Vector3 库,它可以让您使用简单的语法进行简单的 3D 位置操作。我会提到我正在使用 Luaj 来运行用于 Java 操作的 Lua 代码。

这是我的开始代码:

Vector3 = {
new = function (x1, y1, z1)
  return {x = x1, y = y1, z = z1}
end
}



Position1 = Vector3.new(1, 5, 8)
Position2 = Vector3.new(4, 7, 2)

这就是我希望能够发生的事情:

Subtraction = Position1 - Position2
print(Subtraction.x, Subtraction.y, Subtraction.z) -- prints "-3, -2, 6"

关于使 EXACT 代码正常工作有什么想法吗?

最佳答案

这就是元表和元方法的用途。你应该读一读in the documentation .

基本上,它们让您重新定义运算符(和其他一些东西)对您的值执行的操作。您现在需要的是定义 __sub 元方法,它定义了如何处理 - 运算符。我想将来您也会想要重新定义其他元方法。

首先,在您的 Vector3“类”中定义一个减法函数,该函数采用两个向量:

function Vector3.subtract(u,v)
    return Vector3.new(u.x - v.x, u.y - v.y, u.z - v.z)
end

然后创建让 Vector3 知道它应该给所有向量的元表:

Vector3.mt = {__sub = Vector3.subtract}

当你创建一个新的向量时:

new = function (x1, y1, z1)
    local vec = {x = x1, y = y1, z = z1}
    setmetatable(vec, Vector3.mt)
    return vec
end

您还可以使元表 (mt) 成为您的 new 函数中的局部变量 - 这将防止外部代码干扰元表(因为它只会可通过您的 new 函数访问)。但是,将它放在 Vector3 中可以让您检查 v - "string" 等用法:

function Vector3.subtract(u,v)
    if getmetatable(u) ~= Vector3.mt or
       getmetatable(v) ~= Vector3.mt then
        error("Only vectors can be subtracted from vectors", 2)
    end
    return Vector3.new(u.x - v.x, u.y - v.y, u.z - v.z)
end

关于lua - (Lua) 对非数值进行数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453002/

相关文章:

c - 需要帮助用 mingw 编译 jnlua

lua - 如何创建在调用某个函数时调用函数的函数?

io - Lua: io.read() 不适用于长字符串

class - 构建 Lua 类

time - Lua - 当前时间(以毫秒为单位)

f# - fslex 中的 Lua 长字符串

lua - 我可以分析在 Redis 中运行的 Lua 脚本吗?

string - Lua 的 string.format 的转义字符串

c++ - 非源文件更改时触发构建

LuaJIT 能比 C 更快吗?