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仅在键没有关联值时触发。