function - 如果在 LUA 中更改了对象的属性,如何使函数执行?
问题描述
因此,我希望在检测到属性更改后使用一个函数。我怎么做
解决方案
这可以使用元方法__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>
推荐阅读
- react-native - 为什么 socket.io-client 在 React Native 中强制轮询
- google-cloud-dataflow - 尽管启用了 GCP Dataflow API,但未启用它
- botframework - 自适应卡未在 Bot Emulator 上呈现
- c++ - 当它位于两个循环之间时,您可以调用数组的 void 函数吗?
- android - 解密数据时出现 IllegalBlockSizeException “输入长度无效”
- algorithm - 键序列检查搜索
- python-3.x - 比较数据库上一个表和另一个数据库上另一个表的大记录的可能方法
- kotlin - 具有 Kotlin Flow、协程和 NOT 挂起功能的并行 IO 请求
- express - 使用 multer 文件快速上传文件始终未定义
- mule - Munit4 抛出“org.springframework.beans.factory.BeanCreationException:创建名称为 '(inner bean)#1679456e' 的 bean 时出错”