我想知道是否有人可以确认你是否可以信任ipairs();对于索引完整但未排序的表,按顺序返回所有索引. 我们的项目遍布代码,使用pairs()克隆表,但克隆的任何数组都是无序的.我不确定这是否
我们的项目遍布代码,使用pairs()克隆表,但克隆的任何数组都是无序的.我不确定这是否是一个问题.
相比:
A = {10, 20, 30, 40, 50, 60}
至:
B = {[1] = 10, [2] = 20, [3] = 30, [4] = 40, [5] = 50, [6] = 60}
如果用pair()循环它们,则第一个是有序的,而另一个则不是. (在旁注中,如果你做了几个背面插入,B突然被分类)
回到原来的问题.上面的B似乎使用ipairs()按顺序迭代所有值,但是这总是有保证吗?
Lua表没有订单.它只是一组非零键,每个键与一个非零值相关联.
实现确实优化了“数字”键的存储,正整数值从1开始,到他们选择的点结束,增长和缩小内部结构,以及各种表操作的时间 – 内存权衡.
对操作表中的所有键值对.
ipairs在一个概念序列上运行,该序列是连续的正整数值键,其值为1,并在第一个nil值之前结束.其他键值对被忽略.所以,只要您对“索引完成”的想法匹配,您的答案就是“是的,按设计”.
table.sort做同样的事情.其他键值对被忽略.
默认表长度运算符(#)限制性更强.它对具有“序列”的表进行操作,这些表是没有带有正整数值的“数字”键的表(空序列),或者所有带有正整数值的“数字”键都是连续的序列,从1开始.如果对非序列使用默认表长度运算符,则会得到未定义的行为.