我想知道是否有人可以确认您是否可以信任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()
按顺序迭代所有值,但是这总是有保证吗?
答案 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
整数键的表。表是否排序无关紧要。
for i,v in ipairs(t) do body end
将迭代对(
1
,t[1]
),(2
,t[2]
),...,直到表中不存在的第一个整数键
答案 2 :(得分:3)
它只是一组非nil
个键,每个键都与一个非nil
值相关联。
实现确实优化了"数字" -typed键的存储,其中正整数值从1开始并在他们选择的点结束,增长和缩小内部结构,以及各种时间内存权衡表操作。
pairs
对表中的所有键值对进行操作。
ipairs
对连续正整数值键的概念序列进行操作,该键具有1并在第一个nil
值之前结束。其他键值对被忽略。 所以,你的答案是"是的,按设计"只要您对" index-complete"的想法匹配。
table.sort
也是如此。其他键值对将被忽略。
默认表长度运算符(#
)限制性更强。它在具有"序列"的表上运行,这些表是没有"数字" - 具有正整数值的键(空序列)或所有"数& #34;具有正整数值的-typed键是一个连续序列,从1开始。如果对非序列使用默认表长度运算符,则会得到未定义的行为。