一个循环用于迭代多个Lua表

时间:2015-11-21 23:17:42

标签: lua iteration lua-table

是否可以使用相同的循环迭代多个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

但键值表怎么样?

E.g。像这样的东西:

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'

2 个答案:

答案 0 :(得分: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 metamethod。

答案 1 :(得分:-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

它简单,简洁,易于理解。