【问题标题】: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 表中取回这些值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 2011-08-16
        • 1970-01-01
        • 2012-09-11
        相关资源
        最近更新 更多