Lua中的pairs()和ipairs()有什么区别?

时间:2019-03-11 19:12:13

标签: for-loop lua

在for循环中,使用pairs()和ipairs()循环之间有什么区别?此页面同时使用:Lua Docs

使用ipairs():

a = {"one", "two", "three"}
for i, v in ipairs(a) do
  print(i, v)
end

结果:

1   one
2   two
3   three

使用pairs():

a = {"one", "two", "three"}
for i, v in pairs(a) do
  print(i, v)
end

结果:

1   one
2   two
3   three

您可以在这里进行测试:Lua Demo

2 个答案:

答案 0 :(得分:4)

pairs()ipairs()略有不同。

  • pairs()返回键值对,并且主要用于关联表。密钥顺序未指定。
  • ipairs()返回索引值对,并且主要用于数字表。数组中的非数字键将被忽略,而索引顺序是确定性的(按数字顺序)。

下面的代码片段对此进行了说明。

> u={}
> u[1]="a"
> u[3]="b"
> u[2]="c"
> u[4]="d"
> u["hello"]="world"
> for key,value in ipairs(u) do print(key,value) end
1   a
2   c
3   b
4   d
> for key,value in pairs(u) do print(key,value) end
1   a
hello   world
3   b
2   c
4   d
> 

当您创建一个没有键的表时(如您的问题所示),它的行为就像一个数字数组,行为或成对和ipair是相同的。

a = {"one", "two", "three"}

等效于a[1]="one" a[2]="two" a[3]="three"pairs()ipairs()将是相同的(除了pairs()中不能保证的顺序之外)。

答案 1 :(得分:0)

Lua中没有array类型,只有table个可能具有从索引1开始的连续元素。

与数字for循环相反,通用for循环期望三个值:

  1. 可调用
  2. 传递的上下文值
  3. 初始索引值

它使用上下文值和索引值调用可调用对象,并将所有返回值存储在提供的新变量中。另外,第一个保存为新的索引值。

现在,循环的可调用对象的一些代表性示例:

  1. ipairs(t)返回一个函数,表t和起始点0
    该功能在道德上等同于:

    function ipairs_next(t, i)
        i = i + 1
        var v = t[i]
        if v ~= nil then
            return i, v
        end
    end
    

    因此,将显示所有从1开始直到第一个缺失的数字条目。

  2. pairs(t)委托给t的元表,特别是委托给__pairs(t),或返回函数next,表t和起点nilnext接受一个表和一个索引,并返回下一个索引和关联的值(如果存在)。

    因此,所有元素均以任意顺序显示。

  3. 对该功能的创造性没有任何限制,这就是Vanilla Lua期望的。
    有关用户编写的可调用对象的示例,请参见“ Bizzare "attempt to call a table value" in Lua ”,以及在第一个值实际上不是可调用对象的情况下某些方言的反应。