通过路径写入动态多维表
2021-6-2 8:42:34
收藏:0
阅读:163
评论:2
接着 参考动态多维表
我有一个像下面这样的数据结构
local data = {
[1] = {
[1] = { "stuff" },
},
[2] = {
[1] = { "stuff" },
[2] = { "more stuff" },
[3] = {
[1] = "deeper stuff"
}
}
}
我向其中添加了以下元表
__index = function(t, k)
for i,v in ipairs(k) do
if not t then error("attempt to index nil") end
t = rawget(t, v)
end
return t
end
})
print(data[{2,3,1}]
这对于获取数据来说很方便,但是当我尝试设置数据时,它却创建了一个新表。例如,data[{2,3,1}] = "Updated Stuff" 将 data 变成
[1] = {
[1] = { "stuff" }
},
[2] = {
[1] = { "stuff" },
[2] = { "more stuff" },
[3] = {
[1] = "deeper stuff"
}
},
["table: 000001A7E014F570"] = "Updated Stuff"
}
尽管如果我接着调用 print(data[{2,3,1}] 我可以得到正确的值,但是如果我尝试使用 ipairs 递归循环遍历表,则会忽略额外的值。我知道从 Lua 的角度来看,这应该是可能的,但是我只能看到树木而看不到森林。
我想我在寻找 Lua 版的 lodash 的 _.set(table, "path.to.key", value)。
点赞
用户1847592
你应该也实现 __newindex 元方法
local data = {
[1] = {
[1] = { "stuff" },
},
[2] = {
[1] = { "stuff" },
[2] = { "more stuff" },
[3] = {
[1] = "deeper stuff"
}
}
}
setmetatable(data, {
__index = function(t, k)
for i, k in ipairs(k) do
if t == nil then return nil end
if type(t) ~= "table" then error("Unexpected subtable", 2) end
t = rawget(t, k)
end
return t
end,
__newindex = function(t, k, v)
local last_k
for i, k in ipairs(k) do
k, last_k = last_k, k
if k ~= nil then
local parent_t = t
t = rawget(parent_t, k)
if t == nil then
t = {}
rawset(parent_t, k, t)
end
if type(t) ~= "table" then error("Unexpected subtable", 2) end
end
end
rawset(t, last_k, v)
end
})
print(data[{2,3,1}])
data[{2,3,1}] = "更新的东西 #1"
print(data[{2,3,1}])
data[{3,1,2}] = "更新的东西 #2"
print(data[{3,1,2}])
2021-06-02 10:36:10
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

print(data[{2,3,1}])使用索引操作调用__index元方法,接着返回字符串"deeper stuff"。data[{2,3,1}] = "updated stuff"是赋值索引操作,它会调用__newindex而非__index。由于你没有实现
__newindex,所以你只是简单地使用{2,3,1}表作为表键进行常规赋值操作。如果你想使用表的内容作为键来索引
data[2][3][1],就必须实现__newindex。我不确定你为什么会更喜欢
data[{2,3,1}]而非data[2][3][1]。这只会增加混乱。极少数可以使用在表中提供表键的情况可以使用一个简单的函数来解决。但这只是我的个人意见。我只是在上一个答案中展示了什么是可能的,这并不意味着这是一个好主意 :) 如果这不清楚,请原谅。
你可以简单地拥有两个函数:
updateDeep(t, newVal, ...)和getDeep(t, ...),它们可以类似于__index元方法实现。将k替换为{...}。