元表,尝试调用方法 'rename'(零值)
Metatables, attempt to call method 'rename' (a nil value)
这是我第一次使用元表,我在 Lua 演示中做了一个简单的脚本来测试,但它总是给我 "attempt to call method 'rename' (a nil value)",为什么?
peds = {}
function peds.new ( name )
local tb = { name = name }
setmetatable ( tb, { __index = peds } )
return tb
end
function peds.rename ( name )
self.name = name
return self.name == name
end
local ped = peds.new ( "max" )
ped:rename ( "randomname" )
您的代码中有两个(可能的)问题,具体取决于您的设置方式。
如果您只是将上面的内容输入到 REPL 中,那么当您声明 local ped = ...
时,它会立即超出范围并变得不可访问。所以表达式 ped:rename 是无效的,尽管它应该报告 "ped is nil" 而不是 "rename is nil".
如果您将上面的内容保存到脚本并使用 load_file 或其他方式加载它,您仍然会遇到问题,因为此函数签名不正确:
function peds.rename ( name )
应该是:
function peds.rename ( self, name )
与C++类似,在lua中,创建对象方法时,必须先获取隐藏的self
参数,然后调用ped:rename( "random name" )
这只是 ped.rename(ped, "random_name")
的语法糖。如果 self 参数不存在那么它就不会工作,甚至可能会说 "function not found / rename is nil" 因为签名不匹配。
这是我第一次使用元表,我在 Lua 演示中做了一个简单的脚本来测试,但它总是给我 "attempt to call method 'rename' (a nil value)",为什么?
peds = {}
function peds.new ( name )
local tb = { name = name }
setmetatable ( tb, { __index = peds } )
return tb
end
function peds.rename ( name )
self.name = name
return self.name == name
end
local ped = peds.new ( "max" )
ped:rename ( "randomname" )
您的代码中有两个(可能的)问题,具体取决于您的设置方式。
如果您只是将上面的内容输入到 REPL 中,那么当您声明 local ped = ...
时,它会立即超出范围并变得不可访问。所以表达式 ped:rename 是无效的,尽管它应该报告 "ped is nil" 而不是 "rename is nil".
如果您将上面的内容保存到脚本并使用 load_file 或其他方式加载它,您仍然会遇到问题,因为此函数签名不正确:
function peds.rename ( name )
应该是:
function peds.rename ( self, name )
与C++类似,在lua中,创建对象方法时,必须先获取隐藏的self
参数,然后调用ped:rename( "random name" )
这只是 ped.rename(ped, "random_name")
的语法糖。如果 self 参数不存在那么它就不会工作,甚至可能会说 "function not found / rename is nil" 因为签名不匹配。