首页 > 解决方案 > 如果在 LUA 中更改了对象的属性,如何使函数执行?

问题描述

因此,我希望在检测到属性更改后使用一个函数。我怎么做

标签: functionlua

解决方案


这可以使用元方法__index和来实现__newindex,但有一些限制。您需要使用代理表,即结果表不会与观察表相同,因为__newindex只有当表不包含键时才会调用元方法。

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

<script src="https://cdn.jsdelivr.net/npm/fengari-web@0.1.4/dist/fengari-web.js"></script>

<script type="application/lua">

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

</script>


推荐阅读