所以我知道如果它不包含我引用的变量,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])
使用元表和嵌套表时是否还需要更多工作? 或者有办法解决这个问题吗?
答案 0 :(得分:0)
在此代码中,它将替换metatables变量,而不是在表引用中设置它。
我认为这是可以预料的;代码检索tbl1
密钥并在与该密钥关联的表中设置字段。密钥不存在于表中,仅存在于元表中,因此它设置在其中。如果您在表b = setmetatable({tbl1 = {}}, a)
中添加相同的密钥,则会在该表中看到该值已设置。
使用元表和嵌套表时是否还需要更多工作?或者有办法解决这个问题吗?
我不确定你期望的结果。 Lua没有autovivification,如果它不存在,会tbl.foo = 1
创建表tbl
。如果表格中已存在字段tbl1
,则该行为正是您所期望的。如果它出现在metatable中,并且您修改了它的字段,那么这正是它将被修改的地方。