访问密钥时的Metamethod是可变的

时间:2016-03-10 10:53:29

标签: lua lua-table meta-method

在以不可变的方式访问时调用

__index

local foo = bar["foo"];
当访问为不可存在的索引时,

__newindex被调用:

local bar = { }
bar["foo"] = 123 -- calls __newindex
bar["foo"] = 456 -- does NOT call __newindex

当访问密钥作为可变的evey时间时,是否存在可以调用的元方法,即不仅仅是密钥还不存在?

我想创建一个行为,以便当用户在表中设置键时,它会调用本机方法,而不管该键是否已存在。

3 个答案:

答案 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不是表时,会发生此事件   见表。

......对于这两种情况。

您最好的选择是将值存储在您的另一个表或子表中。