当前位置 : 主页 > 网络编程 > lua >

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

来源:互联网 收集:自由互联 发布时间:2021-06-23
我想知道是否有人可以确认你是否可以信任ipairs();对于索引完整但未排序的表,按顺序返回所有索引. 我们的项目遍布代码,使用pairs()克隆表,但克隆的任何数组都是无序的.我不确定这是否
我想知道是否有人可以确认你是否可以信任ipairs();对于索引完整但未排序的表,按顺序返回所有索引.

我们的项目遍布代码,使用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开始.如果对非序列使用默认表长度运算符,则会得到未定义的行为.

网友评论