4

我制作了一个由 Lua 解释器操作的交互式命令 shell。用户输入一些命令,shell调用类似的东西lua_dostring来执行它。我想让用户在任意表中定义自己的函数,并自动将其保存到单独的存储(如文件)中。根据手册,我可以得到用户输入的准确源代码lua_Debug

在所有执行完成后,看起来可以将函数源保存到某些文件中。但是我想在添加/删除时自动保存。

我可以检测到某个值刚刚添加到表中的时刻吗?

4

2 回答 2

5

是的。如果你有一张桌子tbl,每次发生这种情况:

tbl[key] = value

调用元表__newindextbl的元方法。所以你需要做的是提供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);

当然,您必须找到一种方法来在感兴趣的表上设置元表。

于 2011-06-20T18:53:12.753 回答
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

于 2011-06-20T18:58:29.120 回答