Lua 元表,尝试调用方法“重命名”(一个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

这是我第一次使用元表,我在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
    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,:语法可用于方法调用和方法声明。