__index
:
local foo = bar["foo"];
当访问为不可存在的索引时, __newindex
被调用:
local bar = { }
bar["foo"] = 123 -- calls __newindex
bar["foo"] = 456 -- does NOT call __newindex
当访问密钥作为可变的evey时间时,是否存在可以调用的元方法,即不仅仅是密钥还不存在?
我想创建一个行为,以便当用户在表中设置键时,它会调用本机方法,而不管该键是否已存在。
答案 0 :(得分:3)
执行所需操作的标准方法是使用代理表,即具有合适元方法的空表来访问实际表。由于代理是空的,因此每次获取或设置字段时都会调用元方法。
答案 1 :(得分:1)
我很确定你没有这样的元方法。 但是你可以试着找一个解决方法来获得你想要的东西。
例如,您可以尝试以这种方式使用__call
元方法:
local mt = {}
function mt.__call(tbl, key, val)
-- this is called every time you use bar(key, val)
tbl[key] = val
end
local bar = setmetatable({}, mt)
bar("foo", 123)
bar("foo", 456)
print(bar.foo)
或者您可以通过其他方式使用函数来实现此目的。
答案 2 :(得分:0)
Lua中不存在不变性,你只是指索引访问和分配。 Lua 5.3声明......
当table不是表或key不是表时,会发生此事件 见表。
......对于这两种情况。
您最好的选择是将值存储在您的另一个表或子表中。