有没有办法“监听” Lua 表的变化?

Posted

技术标签:

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

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

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

换句话说,

local t = 

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

t.text = "Hello!"

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

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

这可行吗?

【问题讨论】:

【参考方案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不够清楚。详细说明。

以上是关于有没有办法“监听” Lua 表的变化?的主要内容,如果未能解决你的问题,请参考以下文章

基于Lua插件化的Pcap流量监听代理

Node.js 监听 MongoDB 变化

使用监听器检测数据库中的数据变化

vue项目监听滑块并移除。

javascript --- 实时监听输入框值的变化

如何在Angular项目里监听页面关闭、跳转事件?