LUA元表可以协助检测指甲对象吗?

时间:2019-03-23 05:26:44

标签: lua lua-table metatable

我想知道您是否可以通过元表检测到对象的缺失?

'/offline'

1 个答案:

答案 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