元表问题

我知道 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)

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

然而,这段代码不会出现这种情况:

a = {__index = {4, 5, 6}}
b = setmetatable({}, a)
print(b[1], a.__index[1])
b[1] = 2
print(b[1], a.__index[1])

使用元表和嵌套表时需要更多的工作吗? 或者有没有绕过此问题的方法?

点赞
用户1442917
用户1442917

在这个代码中,它会替换元表变量而不是在我引用的表中进行设置。

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

在使用元表和嵌套表时是否需要进行更多的工作?还是有绕过这个问题的方法?

我不确定您期望的结果是什么。Lua不执行自动实现,这将使 tbl.foo = 1 创建表 tbl,如果它不存在的话。如果字段 tbl1 已经存在于表中,则行为正是您所期望的。如果它存在于元表中,并且您修改了它的字段,则它将被修改到这里。

2014-08-25 00:12:33