如果在 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 中更改了对象的属性,如何使函数执行?的主要内容,如果未能解决你的问题,请参考以下文章