我想知道您是否可以通过meta表检测对象的nilling?
foo = {}
foo_mt = {
__newindex = function (t, k, v)
print (k, v)
rawset (t, k, v)
end
}
setmetatable (foo, foo_mt)
foo ['oof'] = 3
outputs: oof 3
foo ['oof'] = nil
__newindex will not be called, so is there another meltable method ?
只是为了澄清,__ 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