4

__index作为不可变访问时调用:

local foo = bar["foo"];

__newindex当作为不存在的可变索引访问时调用:

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

是否有一个元方法可以在访问密钥时作为可变的时间调用,即不仅在密钥不存在的情况下?

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

4

3 回答 3

3

做你想做的事的标准方法是使用代理表,这是一个带有合适元方法的空表来访问实际表。由于代理是空的,因此每次获取或设置其中的字段时都会调用元方法。

于 2016-03-10T12:34:46.373 回答
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)

或者您可以以其他方式使用函数来实现此目的。

于 2016-03-10T11:34:56.653 回答
0

Lua 中不存在不变性,您只是指索引访问和分配。Lua 5.3 状态...

当 table 不是 table 或 table 中不存在 key 时,会发生此事件。

...对于这两种情况。

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

于 2016-03-10T11:39:58.877 回答