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

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

最佳答案



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



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

关于lua - 元表问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25476628/

10-12 03:56