Lua 作为可变项访问密钥时的元方法

Lua 作为可变项访问密钥时的元方法,lua,lua-table,meta-method,Lua,Lua Table,Meta Method,作为不可变访问时调用\u索引: local foo = bar["foo"]; \uuuu newindex在访问不存在的可变索引时调用: local bar = { } bar["foo"] = 123 -- calls __newindex bar["foo"] = 456 -- does NOT call __newindex 是否有一种元方法可以在访问密钥时随时调用,即不只是在密钥不存在的情况下 我想创建一个行为,这样当用户在表中设置一个键时,它就会调用一个本机方法,而不管该键是否已

作为不可变访问时调用
\u索引

local foo = bar["foo"];
\uuuu newindex
在访问不存在的可变索引时调用:

local bar = { }
bar["foo"] = 123 -- calls __newindex
bar["foo"] = 456 -- does NOT call __newindex
是否有一种元方法可以在访问密钥时随时调用,即不只是在密钥不存在的情况下


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

我很确定您没有要求这样的元方法。 但是你可以试着做一个变通办法来得到你想要的

例如,您可以尝试以以下方式使用
\u调用
元方法:

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)

或者您可以通过其他方式使用函数来实现这一点。

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

当表不是表或键不是表时发生此事件 出现在桌子上

…对于这两种情况


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

执行所需操作的标准方法是使用代理表,即带有适当元方法的空表来访问实际表。由于代理是空的,所以每次在代理中获取或设置字段时都会调用元方法。

谢谢。我忘了提到,我不需要用户在表中放置的值实际存在于表中。这些值将存储在本机代码中,因此我需要一个空表,因为它将每次触发_newindex,并且不会在C和Lua代码中复制数据。我会走得更远的。谢谢。虽然我想保留下标语法,但我会按照lhf的建议做,并保持表为空,这正是我所需要的。谢谢你的帮助。Lua 5.1与Lua 5.3在
\uuuu index
\uu newindex
元方法方面没有什么不同。@EgorSkriptunoff感谢你的提示,我将更新我的答案。_index和_newindex仅在键没有关联值时触发。