访问可变键时的元方法

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

local foo = bar["foo"];

在以可变方式访问不存在的索引时调用 __newindex

local bar = { }
bar["foo"] = 123 -- 调用 __newindex
bar["foo"] = 456 -- 不调用 __newindex

是否有一种元方法可以在每次以可变方式访问键时调用,即不仅在键尚不存在时才调用?

我想创建一种行为,使得当用户设置表中的键时,无论该键是否已存在,它都调用本机方法。

点赞
用户3586583
用户3586583

我相当确定你所要求的元方法并不存在。但你可以尝试通过某些方法达到你的目标。

例如,你可以尝试这样使用__call元方法:

local mt = {}
function mt.__call(tbl, key, val)
    -- 每当你使用 bar(key, val) 时都会调用这个函数
    tbl[key] = val
end

local bar = setmetatable({}, mt)

bar("foo", 123)
bar("foo", 456)

print(bar.foo)

或者你可以尝试使用其它函数的方式来实现此效果。

2016-03-10 11:34:56
用户2546626
用户2546626

在 Lua 中不存在不可变性,你指的只是索引的存取和赋值。Lua 5.3 中表示...

当表不是一个表或者键不在表中时,就会发生这种情况。

...这两种情况都是如此。

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

2016-03-10 11:39:58
用户107090
用户107090

标准的方法是使用代理表,即一个空的表具有适当的元方法来访问实际的表。由于代理为空,每次获取或设置其中的字段时都会调用元方法。

2016-03-10 12:34:46