2

这是我第一次使用元表,我做了一个简单的脚本在 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" )
4

1 回答 1

4

您的代码中有两个(可能的)问题,具体取决于您的设置方式。

如果您只是将上述内容输入到 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 参数不存在,那么它将不起作用,或者甚至可能会说“找不到函数/重命名为 nil”,因为签名不匹配。

于 2015-08-27T01:56:17.163 回答