Lua 从表中删除元素时激发的元方法
我正在寻找一种元方法(或解决方法),它在从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
\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)