遍历多个Lua表格的一个循环

3

能否使用同一个循环遍历多个Lua表?

对于索引表的循环,可以像这样操作:

local t1 = {"a", "b", "c"}
local t2 = {"d", "e", "f"}

local num = #t1+#t2
for i=1, num, do
    local j
    local val
    if i <= #t1 then
        j = i
        val = t1[j]
    else
        j = i-#t1
        val = t2[j]
    end

    -- Do stuff
end

但是键值表怎么样呢?例如像这样的东西:
local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1) or pairs(t2) do
    print(key..":  '"..val.."'")
end

应该得到这样的结果:

a:  'a'
b:  'b'
c:  'c'
d:  'd'
e:  'e'
f:  'f'

1
请注意:虽然您没有明确表示您期望这样,但是您应该知道键值对的枚举顺序是不确定的。(哦,还有所有的表都是键值表;只是您选择的构造函数语法不同而已。) - Tom Blodget
是的,谢谢你指出来。在我的情况下,顺序并不重要,我只想获取两个表的所有配对。 - 816-8055
3个回答

4
function pairs(t, ...)
  local i, a, k, v = 1, {...}
  return
    function()
      repeat
        k, v = next(t, k)
        if k == nil then
          i, t = i + 1, a[i]
        end
      until k ~= nil or not t
      return k, v
    end
end

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1, t2) do
    print(key..":  '"..val.."'")
end

注意:此实现不遵守__pairs元方法。

1

对于给定的示例,我认为更加简洁明了的方法是将循环包装在一个迭代表格的外部循环中。

我假设 OP 寻求除了两个循环之外的解决方案主要原因是避免重复编写内部逻辑。这是解决该问题的好方法,只需要增加两行代码:

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for _, tbl in ipairs({ t1, t2 }) do
  for key, val in pairs(tbl) do
    print(key..":  '"..val.."'")
  end
end

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

-1
虽然像Egor这样的迭代器总是很好,但更高效的解决方案是
local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1) do
    print(key..": "..val)
end
for key, val in pairs(t2) do
    print(key..":  '"..val)
end

它简单、简洁且易于理解。


2
这不是OP所要求的。OP要求一个单独的循环。 - Veer Singh
这就是我到目前为止的做法,但并不是只在循环中进行单个打印,还有更多的代码行,我希望在需要改变某些内容时避免复制粘贴错误。 - 816-8055
1
@816 那我建议你把所有的代码放在一个函数里,然后在每次迭代中调用该函数(仍然使用两个单独的循环)。 - warspyking
是的,用两个循环就是正确的做法 :) - 816-8055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接