Lua 元表,尝试调用方法“重命名”(一个nil值)
这是我第一次使用元表,我在Lua演示中做了一个简单的脚本来测试,但它总是让我尝试调用方法“rename”一个nil值,为什么Lua 元表,尝试调用方法“重命名”(一个nil值),lua,lua-table,metatable,Lua,Lua Table,Metatable,这是我第一次使用元表,我在Lua演示中做了一个简单的脚本来测试,但它总是让我尝试调用方法“rename”一个nil值,为什么 peds = {} function peds.new ( name ) local tb = { name = name } setmetatable ( tb, { __index = peds } ) return tb end function peds.rename ( name ) self.name = name
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为nil而不是rename为nil 如果您将上述内容保存到脚本中,并使用load_文件或其他方式加载它,您仍然会遇到问题,因为此函数签名不正确:
function peds.rename ( name )
应该是:
function peds.rename ( self, name )
类似于C++中的工作方式,在Lua中,当你创建一个对象方法时,你必须首先使用隐藏的自参数,当你调用Pe:重命名随机名字时,这只是Po.ReNAMEPIED,RealNo.NoD的语法糖。如果self参数不存在,那么它将不起作用,甚至可能会说function not found/rename为nil,因为签名不匹配。
请注意,function peds.rename self,name也可以写为function peds:rename name。ie,:语法可用于方法调用和方法声明。