【问题标题】:Lua metamethod that fires when removing an element from a table从表中删除元素时触发的 Lua 元方法
【发布时间】:2017-02-22 17:47:43
【问题描述】:

我正在寻找一种在从 lua 表中删除元素时触发的元方法(或解决方法),类似于 __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

我曾尝试使用 __gc 元方法,但由于元方法仅在垃圾回收周期发生时触发,因此在此实现中不可用。我无法控制垃圾收集,因为表(带有元方法)被传递给不同的脚本。

【问题讨论】:

    标签: lua


    【解决方案1】:

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

    让您的mytable 充当代理,并将实际值存储在某个影子表中。它可能与mytable 一起分配,或者数据可以直接存储在元表中(因此必须为每个mytable 实例创建元表)。 这是示例(通过在元方法的名称键下写入数据很容易破坏,但您明白了),数据将存储在元表中: http://ideone.com/eCOal3

    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)
    

    【讨论】:

      【解决方案2】:

      由于分配 nil 根本不会触发元方法,因此您必须使用显式删除函数来执行您希望元方法执行的任何操作,然后将 nil 分配给表条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        相关资源
        最近更新 更多