有没有办法 "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 中。
这纯粹是一个基于兴趣的问题。
有什么方法可以 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 中。