非排序阵列上的ipairs是否可靠?

时间:2014-12-18 14:55:39

标签: loops lua iteration lua-table

我想知道是否有人可以确认您是否可以信任ipairs();对于索引完整但未排序的表,按顺序返回所有索引。

我们的项目中都有使用pairs()克隆表的代码,但克隆的任何数组都是无序的。我不确定这是否是一个问题。

比较

A = {10, 20, 30, 40, 50, 60}

为:

B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}

如果使用pairs()循环这些,则第一个是有序的,而另一个则没有。 (在旁注中,如果你做了几个背面插入,B会突然排序)

回到原来的问题。上面似乎B使用ipairs()按顺序迭代所有值,但是这总是有保证吗?

3 个答案:

答案 0 :(得分:4)

是的,它会。

ipairs()将从索引1连续迭代到n,并在第一个不连续的索引中断。

例如:

B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}    

for i,v in ipairs(B) do
    print(i,v)
end

will print:
1   10
2   20
3   30
4   40
5   50
6   60

但是,

B = {[1] = 10, [2] = 20, [3] = 30, [5] = 40, [6] = 50, [7] = 60}    

for i,v in ipairs(B) do
    print(i,v)
end

will print
1   10
2   20
3   30

因为1,2,3是连续的,但在4中断,所以ipairs会停止。

答案 1 :(得分:3)

是的,保证ipairs按顺序迭代一个带有1整数键的表。表是否排序无关紧要。

来自Reference Manual: ipairs

for i,v in ipairs(t) do body end
     

将迭代对(1t[1]),(2t[2]),...,直到表中不存在的第一个整数键

答案 2 :(得分:3)

Lua表没有订单。

它只是一组非nil个键,每个键都与一个非nil值相关联。


实现确实优化了"数字" -typed键的存储,其中正整数值从1开始并在他们选择的点结束,增长和缩小内部结构,以及各种时间内存权衡表操作。

pairs对表中的所有键值对进行操作。

ipairs对连续正整数值键的概念序列进行操作,该键具有1并在第一个nil值之前结束。其他键值对被忽略。 所以,你的答案是"是的,按设计"只要您对" index-complete"的想法匹配。

table.sort也是如此。其他键值对将被忽略。

默认表长度运算符(#)限制性更强。它在具有"序列"的表上运行,这些表是没有"数字" - 具有正整数值的键(空序列)或所有"数& #34;具有正整数值的-typed键是一个连续序列,从1开始。如果对非序列使用默认表长度运算符,则会得到未定义的行为。