Lua 从表中删除元素时激发的元方法

Lua 从表中删除元素时激发的元方法,lua,Lua,我正在寻找一种元方法(或解决方法),它在从lua表中删除元素时触发,类似于\uu newindex元方法 理想情况下,它的工作方式如下: local mytable = {} local mt = { __newindex = function(t,k,v) rawset(t,k,v) -- some other functionality end, -- This does not exist __remove = function(t,k) --s

我正在寻找一种元方法(或解决方法),它在从lua表中删除元素时触发,类似于
\uu newindex
元方法

理想情况下,它的工作方式如下:

local mytable = {}

local mt = {
  __newindex = function(t,k,v)
    rawset(t,k,v)
    -- some other functionality
  end,

  -- This does not exist
  __remove = function(t,k)
    --some functionality
  end
}

setmetatable(mytable,mt)

-- __newindex fires
mytable["key"] = value

-- __remove fires
mytable["key"] = nil

我尝试过使用
\uu gc
元方法,但由于元方法仅在垃圾收集周期发生时触发,因此在该实现中不可用。我无法控制垃圾收集,因为表(带有metamethods)被传递到另一个脚本。

由于赋值为nil,所以根本不会触发metamethod,您必须求助于显式删除函数,该函数执行您希望元方法执行的任何操作,然后将nil分配给表项。

可能的解决方法-不要在表中存储实际数据

让您的
mytable
充当代理,并将实际值存储在某个影子表中。它可能与
mytable
一起分配,或者数据可以直接存储在元表中(因此必须为每个
mytable
实例创建元表)。 下面是一个示例(通过在metamethods的名称键下写入数据很容易打破,但您知道了),数据将存储在metatable中:

local mytable = {}

local mt = {}

function mt.__newindex(t,k,new_value)
    local previous_value = mt[k]
    rawset(mt,k,new_value)

    if previous_value and new_value == nil then
        print "__remove() triggered"
    end
end
mt.__index = mt

setmetatable(mytable, mt)

mytable.key = 123
print(mytable.key)

mytable.key = nil
print(mytable.key)