有没有办法“监听” 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 表的变化?的主要内容,如果未能解决你的问题,请参考以下文章