Lua 如何同时迭代两个表
对于Lua,我是一个新手,我很难确定如何同时迭代两个表。下面的代码演示了我要做的事情。一些解释 我有两个字符串Lua 如何同时迭代两个表,lua,Lua,对于Lua,我是一个新手,我很难确定如何同时迭代两个表。下面的代码演示了我要做的事情。一些解释 我有两个字符串 slug-带有a/b/c 保存-另一个具有相同形式的字符串,例如x/y/z 我所做的 将/字符上的两个字符串分开,得到两个表 迭代slug表,并将其每个部分放在另一个表slug中 如果slug中的元素包含连字符slugs则执行此操作时,不会获取一个条目,而是两个条目。因此,如果slug是hello/world/stackoverflow将生成一个slug表,其中包含三个元素:hel
a/b/c
x/y/z
slug
表,并将其每个部分放在另一个表slug
中
slug
中的元素包含连字符slugs
则执行此操作时,不会获取一个条目,而是两个条目。因此,如果slug是hello/world/stackoverflow
将生成一个slug
表,其中包含三个元素:hello、world和stackoverflow
hello/world/stack overflow
将生成一个包含四个元素的表:hello、world、stack和overflow
parts
,它在原始hold
表中的条目上建立索引。如果没有连字符驱动的拆分,则存在一对一的对应关系,并且部分包含
{a:hello,b:world,c:stackoverflow}
{a:hello,b:world,c:stack}
但是,使用连字符,hello\world\stack overflow
parts
包含
{a:hello,b:world,c:stackoverflow}
{a:hello,b:world,c:stack}
溢出永远不会成功。我怀疑,通过同时迭代两个表,可能有办法避免这种情况。然而,我无法理解如何/是否可以做到这一点。我试着跟着笔记进去,但没什么进展
在理想情况下,我能做的是动态修改hold
表,以便在其伙伴slug
表的c位置检测到连字符时,它包含{a,b,c0,c1}
有了这一修改,输出的零件表现在将包含
{a:hello,b:world,c0:stack,c1:overflow}
我应该提到,我使用的是Lua5.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 has **FOUR** elements since over-flow got broken up into two
for i,hold in pairs(holds) do
parts[hold] = slugs[i];
end;
--iterating on the "old" holds table will result in parts missing one entry
使用@EtanReisner的建议,将连字符的值保留在表中。这样,通过在数据结构中明确关系,可以避免将键彼此关联(例如c0、c1)的问题。当您以后不得不使用这种编码关系(凌乱的凌乱代码)或当它因不同的输入而中断时(例如,hold='c/c5/a/a3'
),用字符串编码任何东西都会带来麻烦
哪些产出:
b stack
c1 over
c2 flow
a hello
@YuHao-我编辑了我的问题,以更好地解释期望的结果应该是什么。中间段塞的格式是一种要求吗?如果不是,我建议用两个字符串替换字符串overflow
,而用一个字符串表替换它,这样就得到slug={“hello”,“stack”,“over”,“flow”}
这允许您在resolveParts
中的子表上迭代,以获得所需的通用前缀。@EtanReisner-您的建议很可能就是解决方案。没有绝对要求slug
包含元素的最终数量-需要时解析连字符。我想我可以测试slug
的每个元素,当它们被发现是一个表时,输出两个值,c0
和c1
。我打算把这个问题再公开一段时间。但是,建议你做什么作为答案,我至少会投赞成票。是的,想法是你的resolveParts
循环将测试Slug
中的值类型,当它是一个字符串时,表现正常,但当它是一个表时,它将添加另一个循环和一个计数器,以便输出c#=subtab[I]
字段的数量尽可能多。感谢您提供的代码和精彩的解释。非常感谢。