如果在 LUA 中更改了对象的属性,如何使函数执行?

Posted

技术标签:

【中文标题】如果在 LUA 中更改了对象的属性,如何使函数执行?【英文标题】:How do I make a function execute if a property of an object is changed in LUA? 【发布时间】:2020-11-22 03:17:08 【问题描述】:

所以我希望在检测到属性更改后使用一个函数。我该怎么做

【问题讨论】:

请写一个代码作为例子来解释你想要什么(它可能是什么样子)。 本网站讨论属性访问器:lua-users.org/wiki/ObjectProperties __newindex? 见lua.org/pil/13.4.4.html 你可以复制this code,看看能走多远 【参考方案1】:

这可以使用元方法__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>

【讨论】:

以上是关于如果在 LUA 中更改了对象的属性,如何使函数执行?的主要内容,如果未能解决你的问题,请参考以下文章

lua入门笔记7 字符串库

如何在VS2010中运行Lua文件?

Swift inout 如何在未更改时不复制回属性,以不触发对象设置器

如何使vb中textbox内容不能更改

如何检查python函数是否更改(在实时代码中)?

在 Lua 中,如何在 url 中找到特定的字符串?