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

Cal*_*inE 5 iteration lua loops lua-table

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

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

相比:

A = {10, 20, 30, 40, 50, 60}
Run Code Online (Sandbox Code Playgroud)

至:

B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}
Run Code Online (Sandbox Code Playgroud)

如果你循环这些pairs(),第一个是订购而另一个不是.(在旁注中,B如果你做了几个背面插入,突然会被分类)

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

Tom*_*get 3

Lua 表没有顺序。

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


实现确实优化了“数字”类型键的存储,这些正整数值从 1 开始并在其选择的某个点结束,通过各种表操作的时间内存权衡来增长和缩小内部结构。

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

ipairs对连续正整数值键的概念序列进行操作,这些键的值为 1,并在第一个nil值之前结束。其他键值对将被忽略。因此,只要您的“索引完整”想法匹配,您的答案就是“是的,设计使然”。

table.sort做同样的事情。其他键值对将被忽略。

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