LUA元表可以帮助检测nilling对象



我想知道您是否可以通过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

最新更新