Metatable问题

时间:2014-08-24 21:46:41

标签: lua metatable

所以我知道如果它不包含我引用的变量,lua会查看表格的元数据,但是当我尝试设置一个不存在的变量时似乎是错误的但是在表格中,它将其设置在元表中。

这是我的意思的一个例子

a = {__index = {tbl1 = {var = 1}, tbl2 = {var = 2}}}
b = setmetatable({}, a)
print(b.tbl1.var, a.__index.tbl1.var)
b.tbl1.var = 2
print(b.tbl1.var, a.__index.tbl1.var)

在此代码中,它将替换metatables变量,而不是在表引用中设置它。

但是,此代码

不会发生这种情况
a = {__index = {4, 5, 6}}
b = setmetatable({}, a)
print(b[1], a.__index[1])
b[1] = 2
print(b[1], a.__index[1])

使用元表和嵌套表时是否还需要更多工作? 或者有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

  

在此代码中,它将替换metatables变量,而不是在表引用中设置它。

我认为这是可以预料的;代码检索tbl1密钥并在与该密钥关联的表中设置字段。密钥不存在于表中,仅存在于元表中,因此它设置在其中。如果您在表b = setmetatable({tbl1 = {}}, a)中添加相同的密钥,则会在该表中看到该值已设置。

  

使用元表和嵌套表时是否还需要更多工作?或者有办法解决这个问题吗?

我不确定你期望的结果。 Lua没有autovivification,如果它不存在,会tbl.foo = 1创建表tbl。如果表格中已存在字段tbl1,则该行为正是您所期望的。如果它出现在metatable中,并且您修改了它的字段,那么这正是它将被修改的地方。