是否有一种方式可以监听 Lua 表格的更改?

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

是否有一种方法可以监听/监视 Lua 表格并查看是否对其进行更改,然后在向表格添加新条目时调用函数?

换句话说,

local t = {}

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

t.text = "Hello!"

是否有一些方法、函数或其他手段,可以在向表格添加内容后立即调用特定的函数。

我不仅仅想使用定时器来每隔几秒或毫秒循环遍历表格。

这是可行的吗?

点赞
用户3204551
用户3204551

是的,有一种方法可以监听更改。

具体来说,使用元表

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

如果您还想在更改时收到通知,则还需要 __index, __pairs,因为您不能将条目存储在表本身中。

2019-08-21 20:14:07
用户7396148
用户7396148

《Lua 编程》中有一节涵盖了这个问题。

《Lua 编程》:13.4.4 - 追踪表访问

这涉及到使用元表来修改表的基本行为。具体来说,我们需要修改设置表值和从表中获取值时发生的情况,这是创建您所寻找的行为所需的最少条件。

以上链接有一个很好的示例,以下是针对您问题中的代码的示例:

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

2019-08-21 20:14:44