4

所以我知道,如果表的元表不包含我引用的变量,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])

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

4

1 回答 1

0

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

我认为这是可以预料的;该代码检索tbl1键并在与该键关联的表中设置一个字段。键不存在于表中,只存在于元表中,所以它就是在哪里设置的。如果您在表中添加相同的键b = setmetatable({tbl1 = {}}, a),您将看到该表中设置了该值。

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

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

于 2014-08-25T00:12:33.820 回答