lua - 元表,尝试调用方法 'rename'(零值)

标签 lua lua-table metatable

这是我第一次使用元表,我在 Lua 演示中做了一个简单的脚本来测试,但它总是给我“尝试调用方法‘重命名’(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 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 参数不存在,那么它就不会工作,甚至可能会说“找不到函数/重命名为零”,因为签名不匹配。

关于lua - 元表,尝试调用方法 'rename'(零值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239349/

相关文章:

Lua 忽略转义序列

luarocks 安装失败?

c++ - "Undefined reference to"使用 Lua

function - Lua 函数——一个简单的误会

arrays - Lua:使用不同的大小写对字符串数组进行排序

lua - LUA meta tables 可以协助检测 nilling object 吗?

c++ - 如何在 C++ 和 Lua 之间来回传递大型结构

Lua表库被删除了?

oop - 在 Lua 中指定新对象的元表

Lua "attempt to index a nil value": indexing nested tables, 其中几个表可能不存在(使用 __index 和 __newindex 元方法)