(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 中提出每个问题。
将编码放在一个单独的文件中 make 更易于重用和封装您的 class.
1.5 定义 __call
metatable 并让它调用 new
最好在模块文件中定义为本地,然后在文件末尾 return 该值以防止全局名称冲突,允许调用者进行名称的选择。
当使用table时,你必须定义一个像function Vector3:__tostring()
这样的函数,你不能使用local(而且它只是不必要的,因为该函数将包含在table).
您忘记将 new
定义为向量的一部分 class Vector3.new
很抱歉,这是一个如此基本的问题,但我似乎无法理解。我是 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 中提出每个问题。
将编码放在一个单独的文件中 make 更易于重用和封装您的 class.
1.5 定义
__call
metatable 并让它调用new
最好在模块文件中定义为本地,然后在文件末尾 return 该值以防止全局名称冲突,允许调用者进行名称的选择。
当使用table时,你必须定义一个像
function Vector3:__tostring()
这样的函数,你不能使用local(而且它只是不必要的,因为该函数将包含在table).您忘记将
new
定义为向量的一部分 classVector3.new