调试 – 这是lua中的错误,还是我不知道的功能?
发布时间:2020-12-14 21:43:59 所属栏目:大数据 来源:网络整理
导读:我正在尝试教我的一个朋友,基本上,他是用这个代码来找我的,它让我很难过: a = {name = "aaa"}function a:new() self.x = "sss" o = {} setmetatable(o,self) self.__index = self return oendfunction a:some() return "[ " .. self.name .. " ]"endb = a:n
我正在尝试教我的一个朋友,基本上,他是用这个代码来找我的,它让我很难过:
a = {name = "aaa"} function a:new() self.x = "sss" o = {} setmetatable(o,self) self.__index = self return o end function a:some() return "[ " .. self.name .. " ]" end b = a:new() print(b:some()) print(b.x) 打印 [aaa] 两者都不可能,因为它们从来没有被设置为:new 经过一些调试,我调查一下,这里发生了一些有趣的事情: a = {name = "aaa",x = "sss"} function a:new() o = {} print(o.x,self.x) -- nil sss setmetatable(o,self) print(o.x,self.x,o,self,self.__index,o.__index) -- nil sss table: 0x1001280 table: 0x1001320 table: 0x1001320 nil self.__index = self print(o.x,o.__index) -- sss sss table: 0x1001280 table: 0x1001320 table: 0x1001320 table: 0x1001320 return o end 注意第三次打印时,它返回self的.x值,但它是从o调用的,它与self没有“关系”,这怎么可能? 解决方法
您已在metatable中将表a设置为__index字段,用于将使用:new()创建的所有表.当在b表中检查一些不存在的字段时,也将搜索值.这就是为什么你可以在表b中找到字段x或名称,即使你没有明确指定它.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |