【问题标题】:Can I detect the moment of a value is just assigned to a table in Lua?我可以检测到值的时刻刚刚分配给 Lua 中的表吗?
【发布时间】:2013-10-27 05:43:43
【问题描述】:
我制作了一个由 Lua 解释器操作的交互式命令 shell。用户输入一些命令,shell 调用类似lua_dostring 的东西来执行它。我想让用户在任意表中定义自己的函数,并自动将其保存到单独的存储(如文件)中。根据手册,我可以通过lua_Debug 获得用户输入的确切源代码。
看起来可以在所有执行完成后将函数源保存到某些文件中。但是我想在刚刚添加/删除时自动保存。
我可以检测到某个值刚刚添加到表中的时刻吗?
【问题讨论】:
标签:
lua
variable-assignment
watch
【解决方案1】:
是的。如果你有一张桌子tbl,每次发生这种情况:
tbl[key] = value
调用tbls 元表上的元方法__newindex。所以你需要做的是给tbl一个元表并将它设置为__newindex元方法来捕获输入。像这样的:
local captureMeta = {}
function captureMeta.__newindex(table, key, value)
rawset(table, key, value)
--do what you need to with "value"
end
setmetatable(tbl, captureMeta);
当然,您必须想办法在感兴趣的表上设置元表。
【解决方案2】:
这是使用元表的另一种方法:
t={}
t_save={}
function table_newinsert(table, key, value)
io.write("Setting ", key, " = ", value, "\n")
t_save[key]=value
end
setmetatable(t, {__newindex=table_newinsert, __index=t_save})
结果如下:
> t[1]="hello world"
Setting 1 = hello world
> print(t[1])
hello world
请注意,我使用第二个表作为保存值的索引,而不是 rawset,因为 __newindex 仅适用于新插入。 __index 允许您从 t_save 表中取回这些值。