Loops IPAIR在未排序的阵列上可靠吗?

Loops IPAIR在未排序的阵列上可靠吗?,loops,lua,iteration,lua-table,Loops,Lua,Iteration,Lua Table,我想知道是否有人可以确认您是否可以信任ipairs()to;对于索引已完成但未排序的表,按顺序返回所有索引 我们的项目中到处都有使用pairs()克隆表的代码,但是克隆的任何数组都是无序的。但我不确定这是否是个问题 比较: A = {10, 20, 30, 40, 50, 60} 致: 如果您使用对()循环这些,则第一个已订购,而另一个未订购。(在旁注中,B如果你做了几次后插,就会突然被排序) 回到原来的问题。上面的B似乎使用ipairs()按顺序迭代所有值,但这总是有保证的吗?是的,保证ip

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

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

比较:

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

如果您使用
对()循环这些,则第一个已订购,而另一个未订购。(在旁注中,
B
如果你做了几次后插,就会突然被排序)


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

是的,保证
ipairs
按顺序迭代带有
1
中整数键的表。表是否排序并不重要

发件人:

将迭代对(
1
t[1]
),(
2
t[2]
),…,直到表中缺少的第一个整数键

是的,会的

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
但是,

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

Lua表没有顺序。 它只是一组非
nil
键,每个键都与一个非
nil
值关联


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

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

ipairs
对具有1且在第一个
nil
值之前结束的连续正整数值键的概念序列进行操作。忽略其他键值对。所以,你的答案是“是的,是设计的”,只要你的“索引完成”的想法匹配

table.sort
执行相同的操作。忽略其他键值对


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

很好的解释。如果我理解正确;这是因为我使用的Lua实现,
A={10,20,30,40,50,60}
在使用
pairs()循环时会按顺序结束。但是不是标准的一部分。@CalvinE,如果您运行的是Lua 5.2,当您再次运行程序时,遍历顺序可能会改变。谢谢您的参考,这正是我想要的。虽然Tom对实现的详细阐述让我有了更深的理解,并赢得了这次的“解决方案”。
for i,v in ipairs(t) do body end
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