【问题标题】:Is there a way to "listen" for changes in a Lua table?有没有办法“监听” Lua 表的变化?
【发布时间】:2019-08-21 19:57:31
【问题描述】:

这纯粹是一个基于兴趣的问题。

有什么方法可以监听/监控 Lua 表并查看是否对其进行了更改,然后在向所述表添加新条目时调用函数?

换句话说,

local t = {}

local function listener()
    print( "new entry added" )
end

t.text = "Hello!"

是否有一些方法、函数或其他方法可以在将某些内容添加到表后立即调用特定函数。

我不只是想使用计时器每隔几秒或几毫秒不断循环遍历表格。

这可行吗?

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    在《Lua 编程》中有一节介绍了这个问题。

    Programming in Lua: 13.4.4 – Tracking Table Accesses

    这需要使用元表来修改表的基本行为。具体来说,我们需要修改设置表值并从表中获取值时发生的情况,这些是创建您正在寻找的行为的最低要求。

    上面的链接有一个很好的例子,这是你问题中的代码:

    local function listener(k,v)
      print( "new entry added: \n\tKey = " .. k .. "\n\tValue = " .. v)
    end
    local metaTable
    
    do
      local protectedTable = {}
      metaTable = {
        __index = function (t,k)
          return protectedTable[k]
        end,
        __newindex = function (t,k,v)
          protectedTable[k] = v   -- update original table
          listener(k,v)
        end
      }
    end
    
    local t = setmetatable({},metaTable)
    
    t.text = "Hello!"
    print(t.text)
    

    请记住,此方法不允许您在 t 上使用 pairs,因为它是一个空表,并且我没有在示例中的元表中定义 __pairs

    【讨论】:

      【解决方案2】:

      是的,有一种方法可以监听变化。
      具体来说,use the metatable

      __newindex 是您想要的元函数,如果您只对新条目感兴趣,而不是更改的条目。

      如果您还需要更改通知,则还需要__index__pairs,因为您不能将条目存储在表本身中。

      【讨论】:

      • 值得注意的是,__index 无助于检测字段是否已更改。 __index 仅在表中不存在索引值时调用。 lua.org/pil/13.4.1.html
      • @Nifim 也许我对为什么需要__index__pairs不够清楚。详细说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2023-03-20
      • 2011-01-17
      • 2019-11-26
      • 2020-07-30
      相关资源
      最近更新 更多