如何在 LUA 中使函数在对象属性更改时执行?

所以我想要在检测到属性更改时使用函数。我该怎么做

点赞
用户12918181
用户12918181

这可以通过元方法__index__newindex实现,但有些限制。您需要使用代理表格,即结果表将与观察表不同,因为只有当表不含有键时才调用元方法__newindex

如果您需要观察嵌套表属性,则必须创建递归代理表格并动态修改。

function observable(data, callback)
  return setmetatable({}, {
    __index = data,
    __newindex = function(self, n, v)
      local oldv = data[n]
      if v ~= oldv then
        data[n] = v
        callback(n, v, oldv)
      end
    end
  })
end

local my_object = { test1 = 'value1' }
my_object = observable(my_object,
  function(key,value,oldvalue)
    print('key='..key
          ..', value='..tostring(value)
          ..', oldvalue='..tostring(oldvalue))
    end)

my_object.test1 = 1
my_object.test2 = 2
my_object.test1 = 'othervalue'
my_object.test2 = nil
2020-08-02 19:24:46