我制作了一个由 Lua 解释器操作的交互式命令 shell。用户输入一些命令,shell调用类似的东西lua_dostring
来执行它。我想让用户在任意表中定义自己的函数,并自动将其保存到单独的存储(如文件)中。根据手册,我可以得到用户输入的准确源代码lua_Debug
。
在所有执行完成后,看起来可以将函数源保存到某些文件中。但是我想在添加/删除时自动保存。
我可以检测到某个值刚刚添加到表中的时刻吗?
我制作了一个由 Lua 解释器操作的交互式命令 shell。用户输入一些命令,shell调用类似的东西lua_dostring
来执行它。我想让用户在任意表中定义自己的函数,并自动将其保存到单独的存储(如文件)中。根据手册,我可以得到用户输入的准确源代码lua_Debug
。
在所有执行完成后,看起来可以将函数源保存到某些文件中。但是我想在添加/删除时自动保存。
我可以检测到某个值刚刚添加到表中的时刻吗?
是的。如果你有一张桌子tbl
,每次发生这种情况:
tbl[key] = value
调用元表__newindex
上tbl
的元方法。所以你需要做的是提供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);
当然,您必须找到一种方法来在感兴趣的表上设置元表。
这是使用元表执行此操作的另一种方法:
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
。