Lua程序设计中的pairs函数

我定义了两组值:

local A1 = {100, 200, 300, 400}
local A2 = {500, 600, 700, 800}

我想要使用一个循环,将A1和A2中的值作为一对一对地赋值给另一个变量B1和B2,如下所示:

B1 = 100,B2 = 500 (第一次循环)
B1 =200,B2 = 600 (第二次循环)
B1 = 300,B2 = 700 (第三次循环)
B1=400,B2 = 800 (第四次循环)

我尝试使用ipairs来实现,代码如下:

for i, f1 in ipairs(A1) do
for j, f2 in ipairs(A2) do
B1 = f1
B2 = f2
end
end

但是这给我返回的结果是:

B1 = 100,B2 = 500 (第一次循环)
B1 =100,B2 = 600 (第二次循环)
B1 = 100,B2 = 700 (第三次循环)
B1=100,B2 = 800 (第四次循环)
B1 = 200,B2 = 500 (第五次循环)
B1 =200,B2 = 600 (第六次循环)
B1 =200,B2 = 700 (第七次循环)
....
...
...
以此类推...

有谁能帮我用正确的方式编写代码吗?

点赞
用户2505965
用户2505965

你可以使用数字循环轻松完成这项任务:

for i = 1, 4 do
    local a, b = A1[i], B1[i]
    --- 使用它们
end

_如何_确定需要执行的迭代次数是棘手的部分。 如果大小不同,但每个表与其他表的长度相同,则可以使用长度运算符(#A1)。

或者,您可能需要一个函数来返回给定一组表中最大的长度。

local function max_table_len (...)
    local tabs = { ... }
    local len = 0

    for i = 1, #tabs do
        local l = #tabs[i]

        if l > len then
            len = l
        end
    end

    return len
end

甚至可以使用辅助函数来获取每个值。

local function get_from_tables (index, ...)
    local values = { ... }
    local len = #values

    for i = 1, len do
        values[i] = values[i][index]
    end

    return table.unpack(values, 1, len)
end

最终得到像这样的东西:

for index = 1, max_table_len(A1, B1) do
    local a, b = get_from_tables(index, A1, B1)
end
2016-09-08 22:29:32
用户4447998
用户4447998

你可以在 Programming in Luaipairs 的示例基础上进行构建。例如,这个版本可以同时迭代两个序列:

-- 迭代器函数
local function iter_ipairs2(tablePair, i)
  i = i + 1
  local v1 = tablePair[1][i]
  local v2 = tablePair[2][i]
  -- 如果使用 'and',迭代会在完成最短序列后停止。
  -- 如果使用 'or',迭代会在完成最长序列后停止。
  if v1 and v2 then
    return i, v1, v2
  end
end

-- 这是你在其他代码中将调用的函数:
local function ipairs2(t1, t2)
  return iter_ipairs2, {t1, t2}, 0
end

-- 使用方法:
local A1 = {100, 200, 300, 400, 500}
local A2 = {500, 600, 700, 800}

for i, v1, v2 in ipairs2(A1, A2) do
    print(i, v1, v2)
end
2016-09-09 06:01:59
用户2242940
用户2242940

之前的答案更详细,提供了一个更通用和更好的答案。

这个答案是给那些很陌生 Lua 的人的。它不仅展示了两个循环,还加强了一个惯常方式并不止一个。

local A1 = {100, 200, 300, 400}
local A2 = {500, 600, 700, 800}

print("简单的答案:")
-- 不使用 ipairs 并假定 A1 和 A2 的大小相同
for i = 1, #A1 do
    B1 = A1[i]
    B2 = A2[i]
    print(B1, B2, "(iteration #"..i..")")
end

print()

print("使用 ipairs 的答案:")
-- 再次假定 A1 和 A2 的大小相同
for i, v in ipairs(A1) do
    B1 = A1[i]      -- i 遍历 A1 和 A2
    B2 = A2[i]      -- 这个原因是因为 A1 和 A2 的大小相同
    print(B1, B2, "(iteration #"..i..")")
end

给出这个输出:

简单的答案:
100 500 (iteration #1)
200 600 (iteration #2)
300 700 (iteration #3)
400 800 (iteration #4)

使用 ipairs 的答案:
100 500 (iteration #1)
200 600 (iteration #2)
300 700 (iteration #3)
400 800 (iteration #4)
2016-09-13 00:29:24