Lua 中有没有一种方法可以知道数组中是否添加或删除了键值对?
2020-11-16 12:57:28
收藏:0
阅读:117
评论:2
local t = {}
local mt = setmetatable({
-- 一些元方法,用于判断键值对何时被添加或丢失并打印消息
}, t)
是否有一种方法可以做到这一点?我和某人谈论过这个问题,他们说我不能仅用元方法,还需要使用代理,但我对如何使其工作有点困惑。有人能帮忙吗?
谢谢
点赞
用户12918181
为了在lua中跟踪表的键,其中最重要的 metatable 键有两个:__index 和 __newindex。
__newindex 用于创建新的键,如果没有找到这样的键,则创建它。__index 用于在表中没有这样的键时获取值。
使用 __newindex 可以跟踪创建,但无法跟踪赋值,因此无法跟踪键的删除:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
setmetatable(t, {
__newindex = function(self, key, value)
print('Added Key:'..key,'Value:'..value)
rawset(self, key, value)
end
})
t.test = 'test'
t.test = nil -- delete not tracked
t.test = 'test2'
</script>
使用代理表和 __newindex 以及 __index,我们可以跟踪每个赋值:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
local proxytable={}
setmetatable(t, {
__newindex = function(self, key, value)
if proxytable[key] then
if value == nil then
print('Deleted Key:'..key)
else
print('Changed Key:'..key,'Value:'..value)
end
else
print('Added Key:'..key,'Value:'..value)
end
rawset(proxytable, key, value)
end,
__index = proxytable
})
t.test = 'test'
t.test = nil
t.test = 'test2'
t.test = 'test3'
t.test = nil
</script>
如果要用 pairs()、ipairs() 枚举表的键,则需要使用元键__pairs和__ipairs,因为原始表始终为空。
2020-11-14 15:01:54
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

local tab = {} local meta = {} setmetatable(tab, { __newindex = function(self, key, value) print(key, value) rawset(self, key, value) end }) tab[1] = 'this' tab[#tab + 1] = 'that' tab.the = 'other' tab[3] = nil tab[4] = 2tab[1] = 'this'tab[#tab + 1] = 'that'tab.the = 'other'tab[3] = niltab[4] = 2