对于Lua来说,我是一个新手,我很难确定如何同时迭代两个表。下面的代码展示了我想要做的事情。一些解释
我有两个字符串
a/b/c
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}
溢出永远不会成功。我怀疑通过同时迭代两个表来避免这种情况。但是,我无法理解如何做到这一点。我试着按照this tutorial中的注释,但没有取得什么进展。
在一个理想的世界中,我能够做的是即时修改hold
表,以便在 c 中检测到连字符时包含{a,b,c0,c1}
1} em>在其合作伙伴中的位置,slug
,表格。
通过这种改变,输出的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 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
端;
local slug = explode('/',"hello/stack/over-flow");
local holds = explode("/","a/b/c");
--Both slug & hold are tables containing 3 elements
local parts = resolveParts(slug,holds);
答案 0 :(得分:1)
使用@ 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)
-- check for hyphens and split again
for k, v in pairs(parts) do
if v:find'-' then
parts[k] = split(v, '-')
end
end
-- check for table or string when using 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
输出:
b stack
c1 over
c2 flow
a hello