Lua metatable变量声明

时间:2012-05-19 21:26:27

标签: variables lua metatable

我不知道该怎么命名这个问题,因为我不了解发生了什么。(随意编辑)

请考虑以下代码。

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.xtable.y。这让我意识到两者之间存在差异。

有人可以解释一下差异是什么以及将变量放在不同的地方的原因是什么?

1 个答案:

答案 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