我可以检测到一个值刚刚分配给Lua表的时刻吗?

发布于 2024-11-16 02:41:12 字数 246 浏览 2 评论 0原文

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

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

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

I made an interactive command shell which is operating by Lua interpreter. User input some command, shell calls something like lua_dostring to execute it. I want to allow users to define their own functions in arbitrary table, and save it to separated storage (like a file) automatically. According to the manual, I can get exact source code input by user with lua_Debug.

It looks possible to save the functions sources to some files after all execution done. But I want to save automatically when it's just added/remove.

Can I detect the moment of some value is just added to a table?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若无相欠,怎会相见 2024-11-23 02:41:12

是的。如果您有一个表 tbl,每次发生这种情况时:

tbl[key] = value

都会调用 tbl 元表上的元方法 __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);

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

Yes. If you have a table tbl, every time this happens:

tbl[key] = value

The metamethod __newindex on tbls metatable is called. So what you need to do is give tbl a metatable and set it's __newindex metamethod to catch the input. Something like this:

local captureMeta = {}
function captureMeta.__newindex(table, key, value)
    rawset(table, key, value)
    --do what you need to with "value"
end

setmetatable(tbl, captureMeta);

You will have to find a way to set the metatable on the tables of interest, of course.

怂人 2024-11-23 02:41:12

这是使用元表执行此操作的另一种方法:

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 表中获取这些值。

Here's another way to do this with metatables:

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})

Here's the result:

> t[1]="hello world"
Setting 1 = hello world
> print(t[1])
hello world

Note that I'm using a second table as the index to hold the values, instead of rawset, since __newindex only works on new inserts. The __index allows you to get these values back out from the t_save table.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文