繁体   English   中英

元表,尝试调用方法“重命名”(nil值)

[英]Metatables, attempt to call method 'rename' (a nil value)

这是我第一次使用元表,我在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 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”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM