元表,尝试调用方法“rename”(值为 nil)。

这是我第一次使用 metatables,在 Lua demo 中编写了一个简单的脚本进行测试,但总是出现“尝试调用方法'rename'(一个空值)”的错误,为什么?

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" )
点赞
用户3598119
用户3598119

你的代码可能存在两个问题,这取决于你是如何设置的。

如果你只是在 REPL 中输入上述代码,那么当你声明“local ped = ...”时,它会立即超出作用域,并且变为不可访问。因此,表达式 ped:rename 是无效的,尽管它应该报告“ped 为 nil”,而不是“rename 为 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 参数不存在,那么它将无法正常工作,或者甚至可能会显示“找不到函数 / rename 为 nil”,因为签名不匹配。

2015-08-27 01:56:17