我正在尝试教我的一个朋友,基本上,他是用这个代码来找我的,它让我很难过:
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]
SSS
两者都不可能,因为它们从来没有被设置为: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, self.x, o, self, self.__index, 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或名称,即使你没有明确指定它.