元表,尝试调用方法 '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" 因为签名不匹配。