我想知道您是否可以通过元表检测到对象的缺失?
'/offline'
答案 0 :(得分:0)
请澄清一下,__ newindex仅在前一个值为nil时触发。因此,以下代码将触发__newindex两次:
foo = {}
foo_mt = {
__newindex = function (t, k, v)
print (k, v)
rawset (t, k, v)
end
}
setmetatable (foo, foo_mt)
foo['oof'] = nil
foo['oof'] = nil
如果foo ['oof']已经具有非nil值,则将不会调用__newindex(因为索引已经存在)。
但是,是的,如果要捕获表的所有修改(如Egor指出的那样),则需要一个空的代理表。
proxy = {}
foo = {}
foo_mt = {
__newindex = function (t, k, v)
print (k, v)
rawset (proxy, k, v)
end,
__index = function(t, k)
return rawget(proxy, k)
end
}
setmetatable (foo, foo_mt)
foo['ok'] = true
foo['ok'] = nil