这纯粹是一个基于兴趣的问题。
是否有某种方法可以侦听/监视Lua表,并查看是否对其进行了更改,然后在向该表中添加新条目时调用该函数?
换句话说,
local t = {}
local function listener()
print( "new entry added" )
end
t.text = "Hello!"
在将某些内容添加到表后,是否可以使用某些方法,函数或其他方式来调用特定函数。
我不只是想使用计时器来每隔几秒或几毫秒不断循环遍历该表。
这可行吗?
答案 0 :(得分:3)
是的,有一种方法可以倾听变化。
具体来说,use the metatable。
__newindex
是您想要的元函数,如果您只对新条目感兴趣,而不对更改的条目感兴趣。
如果您还希望收到有关更改的通知,则还需要__index
,__pairs
,因为您不能将条目存储在表本身中。
答案 1 :(得分:3)
Lua编程中有一节解决了这个问题。
Programming in Lua: 13.4.4 – Tracking Table Accesses
这需要使用元表来修改表的基本行为。具体来说,我们需要修改设置表值并从表中获取值时发生的情况,这是创建所需行为的最低要求。
上面的链接有一个很好的例子,这是您所要查询的代码之一:
jhdf
需要记住的一点是,此方法不允许您在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)
上使用pairs
,因为它是一个空表,并且在示例中我没有在元表中定义t
。