(Lua) 另一个文件中的简单元表

(Lua) Simple metatable in another file

很抱歉,这是一个如此基本的问题,但我似乎无法理解。我是 Lua 的初学者,所以我有几个问题。

我的目标是制作一个小的“class”Vector3。我正在使用放在文件 vector3.lua.

中的元表

1) 由于我的元表 Vector3 与我的 main.lua 位于不同的文件中,我假设我是否正确正在写一个“模块”?这真的不同于将我的代码放在与我的主文件相同的文件中吗?

1.5) 如果我正在编写一个模块,有没有办法创建一个“新”函数以在主函数中使用此语法:

v = Vector3(3, 2, 4)

假设我将 vector3.lua 导入为

local Vector3 = require "Vector3"

?

2)是否所有模块都需要

return Vector3

在模块的末尾?为什么?

3) 最后,我无法理解我的编译错误。 这些是我的文件:

vector3.lua

local Vector3 = {} 
Vector3.__index = Vector3

local function new(x, y, z)
    return setmetatable( {x=x, y=y, z=z} , Vector3 )
end

local function Vector3:__tostring() -- this is my 8th line in my editor (the error line)
    return "(x:" .. self.x .. ", y:" .. self.y .. ", z:" .. self.z .. ")"
end

local function Vector3.__newindex()
    print("You cannot add another axis to a vector3")
end

return Vector3

main.lua

local Vector3 = require "Vector3"

v = Vector3.new(3, 2, 4)

print(v)

我的错误

$ lua main.lua
lua: error loading module 'Vector3' from file './Vector3.lua':
    ./Vector3.lua:8: '(' expected near ':'
stack traceback:
    [C]: in ?
    [C]: in function 'require'
    main.lua:1: in main chunk
    [C]: in ?

可能是什么问题?

4) 即使我评论我的 :__tostring() 和 .__newindex 函数,这也是我得到的另一个错误:

$ lua main.lua
lua: main.lua:3: field 'new' is not callable (a nil value)
stack traceback:
    main.lua:3: in main chunk
    [C]: in ?

这是另一个问题还是因为我的元表没有功能(覆盖(我正在考虑 __add,等等)或没有)除了新的?

感谢您的宝贵时间!

为了将来的通知,您应该在单独的 post 中提出每个问题。

  1. 将编码放在一个单独的文件中 make 更易于重用和封装您的 class.

    1.5 定义 __call metatable 并让它调用 new

  2. 最好在模块文件中定义为本地,然后在文件末尾 return 该值以防止全局名称冲突,允许调用者进行名称的选择。

  3. 当使用table时,你必须定义一个像function Vector3:__tostring()这样的函数,你不能使用local(而且它只是不必要的,因为该函数将包含在table).

  4. 您忘记将 new 定义为向量的一部分 class Vector3.new