这是我第一次使用元表,我在 Lua 演示中做了一个简单的脚本来测试,但它总是给我“尝试调用方法‘重命名’(nil 值)”,为什么?
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 参数不存在,那么它就不会工作,甚至可能会说“找不到函数/重命名为零”,因为签名不匹配。
关于lua - 元表,尝试调用方法 'rename'(零值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239349/