有没有办法 "listen" 来改变 Lua table?

Is there a way to "listen" for changes in a Lua table?

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

有什么方法可以 listen/monitor a Lua table 并查看是否对其进行了更改,然后在向所述 [=28 添加新条目时调用函数=]?

换句话说,

local t = {}

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

t.text = "Hello!"

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

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

这可行吗?

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

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

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

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

Programming in Lua: 13.4.4 – Tracking Table Accesses

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

上面的 link 有一个很好的例子,这里有一个用于你问题中的代码:

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,因为它是空的 table 而我没有定义 __pairs在我的示例中的 metatable 中。