如何同时迭代两个表格
2021-3-11 22:40:13
收藏:0
阅读:122
评论:1
我对 Lua 不是很熟练,在试图同时迭代两个表时遇到了麻烦。下面的代码演示了我想要做的事情。一些解释:
我有两个字符串
- slug —— 一个形如
a/b/c的字符串。 - holds —— 另一个形如
x/y/z的字符串。
我的做法
- 用
/字符将两个字符串分割成两个表。 - 迭代
slug表,并将其每个部分放入另一个表slugs中。 - 在这样做的同时,如果
slug中的一个元素包含连字符,则slugs表不只是一个条目,而是两个条目。因此,如果slug是hello/world/stackoverflow,则会生成一个slugs表,其中包含三个元素:hello、world 和 stackoverflow。 - 但是,
hello/world/stack-overflow会生成一个包含四个元素的表:hello、world、stack 和 overflow。
问题所在
现在我输出另一个表 parts,该表的索引是原始 hold 表中的条目。如果没有连字符分割,那么就会有一一对应的关系,parts 就包含:
{a:hello,b:world,c:stackoverflow}
然而,如果有连字符,如 hello\world\stack-overflow,parts 就包含
{a:hello,b:world,c:stack}
Overflow 没有出现。我怀疑可以通过同时迭代两个表来避免这个问题。但是,我无法理解如何/是否可以做到这一点。我试图遵循 这个教程 中的笔记,但没有取得多少进展。
在理想的情况下,我希望能够即时修改 hold 表,以便在检测到连字符时,其对应的 slug 表中的位置 c 包含 {a,b,c0,c1}。
如果这个修改生效,那么输出的 parts 表就会包含
{a:hello,b:world,c0:stack,c1:overflow}
我应该提到我正在使用 Lua 5.1,没有升级到更高版本的选项。
function explode(div,str)
if (div=='') then return false end
local pos,arr = 0,{};
local part = "";
for st,sp in function() return string.find(str,div,pos,true) end do
part = string.sub(str,pos,st-1);
if ((0 < string.len(part)) and ("rest" ~= part)) then
table.insert(arr,part);
end;
pos = sp + 1
end
table.insert(arr,string.sub(str,pos))
return arr
end;
function resolveParts(slug,holds)
local parts,slugs = {},{};
for i,s in pairs(slug) do
if (string.find(s,'%-')) then
s = explode('-',s);
table.insert(slugs,s[1]);
table.insert(slugs,s[2]);
else
table.insert(slugs,s);
end;
end;
--slugs 包含 **四个** 元素,因为 over-flow 被分成了两部分
for i,hold in pairs(holds) do
parts[hold] = slugs[i];
end;
--在“old”holds表上迭代将导致在“parts”中丢失一个条目
local slug = explode('/',"hello/stack/over-flow");
local holds = explode("/","a/b/c");
-- slug & hold 都是包含 3 个元素的表
local parts = resolveParts(slug,holds);
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
使用 @EtanReisner 的建议,将连字符的值保留在表格中。通过在数据结构中显式地表示关系,如 c0、c1,可以避免将键与彼此关联的问题。在字符串中编码任何内容会在以后使用编码的关系(混乱慈强的代码)或者在输入不同的情况下(如
hold='c/c5/a/a3')导致问题时,要求出问题。function split(str, sep) local parts = {} for m in str:gmatch('[^' .. sep .. ']+') do parts[#parts + 1] = m end return parts end function join(ks, vs) local t = {} for i, k in pairs(ks) do t[k] = vs[i] end return t end slugs = split('hello/stack/over-flow', '/') holds = split('a/b/c', '/') parts = join(holds, slugs) -- 检测连字符并重新分割 for k, v in pairs(parts) do if v:find('-') then parts[k] = split(v, '-') end end -- 在使用 parts 时检测表格或字符串 for k, v in pairs(parts) do if type(v) == "table" then for i, vi in ipairs(v) do print(k .. i, vi) end else print(k, v) end end输出结果如下: