我不知道该怎么命名这个问题,因为我不了解发生了什么。(随意编辑)
请考虑以下代码。
function object:new() o = o or { x = 0 } setmetatable(o, self) self.__index = self self.y = 0 return o end table = object:new()
稍后变量(o.x和self.y)之间有什么区别?
如果我print_r变量table
,则仅返回x。但是,可以访问table.x
和table.y
。这让我意识到两者之间存在差异。
有人可以解释一下差异是什么以及将变量放在不同的地方的原因是什么?
答案 0 :(得分:4)
稍后变量(o.x和self.y)之间有什么区别?
此处有两个表格, object
和 o
。
在object:new
内,self
引用表object
。因此,self.y
是表object
中的字段。
o
是您在每次调用object:new
时创建的新表格。 o.x
是表o
中的字段。
o
表只有一个条目:o["x"]
,所以当你迭代表中的条目时(如print_r
那样),那就是你要看的全部内容。
那么为什么o.y
会给你一个价值呢?因为您将表object
设置为o
的 metatable ,并且metatable已将其设置为__index
字段,因此当{{1}上的索引尝试失败时,Lua将通过o
的metatable再次尝试(如果设置了__index)。
一些小代码可能会让这个更清晰:
o