ipairs在未排序的数组上是否可靠?

我想知道是否有人能够确认在一个索引完整但未排序的表中,可以信任 ipairs() 返回所有的索引并按顺序排列。我们的项目中有很多使用 pairs() 从表格中克隆数据的代码,但是任何克隆出来的数组都无序。我不确定这是否是一个问题。

比较一下:

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

和:

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

如果使用 pairs() 循环这些表格,第一个表格是有序的,而第二个表格则是无序的。(顺便说一句,如果你反向插入几个值,B 就会突然排序)

回到最初的问题。似乎使用 ipairs() 遍历上面的 B 表会按顺序遍历所有值,但这是否总是保证的呢?

点赞
用户1009479
用户1009479

是的,ipairs 保证以顺序遍历具有整数键的表,从 1 开始。表是否排序并不重要。

引用自参考手册:ipairs

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

将遍历 ( 1, t[1])、( 2, t[2])、……,直到第一个不在表中的整数键。

2014-12-18 15:01:07
用户1474999
用户1474999

是的,它会。

ipairs() 函数会连续迭代从索引 1n,并在第一个不连续的索引处停止。

例如:

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

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

将输出:
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

将输出:
1   10
2   20
3   30

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

2014-12-18 15:03:35
用户2226988
用户2226988

Lua 表没有顺序。

它仅是一组非 nil 键,每个键都与一个单独的非 nil 值相关联。


实现会优化存储从 1 开始到某个选择点结束的具有正整数值的“数字”类型键,以时间 - 内存权衡方式增长和缩小内部结构以进行各种表操作。

pairs 操作一个表中的所有键值对。

ipairs 操作一个概念上连续的正整数键序列,其中键的范围为 1 到第一个 nil 值之前。其他键值对将被忽略。因此,只要你的“索引完整”想法匹配,你的答案就是“是的,按设计来说”。

table.sort 也一样。其他键值对将被忽略。

默认的表长度操作符( #)更为严格。它操作具有“序列”的表,这些表没有具有正整数值的“数字”类型键(一个空序列),或者所有具有正整数值的“数字”类型键都是一个连续的序列,从 1 开始。如果在非序列上使用默认的表长度操作符,则会出现未定义的行为。

2014-12-18 16:53:21