ruby中的.each迭代器是否保证每次都在相同的元素上给出相同的顺序?
我正在使用列表’a’做这样的事情:
a.each_with_index |outer, i| a.each_with_index |inner, j| if(j > i) # do some operation with outer and inner end end end
如果迭代器不会使用相同的顺序,这将不起作用。 我不关心命令究竟是什么,我只需要两个.each_with_index迭代器来使用相同的顺序。
我会假设它是一个数组的属性,它有一个固定的顺序,我只是偏执,迭代器不会使用该顺序…
这取决于您正在操作的特定Enumerable
对象。
例如,数组将始终以相同的顺序返回元素。 但是其他可枚举的对象并不能保证以这种方式运行。 一个很好的例子是1.8,7基础哈希。 这就是许多框架(最着名的是ActiveSupport)实现OrderedHash的原因。
一个有趣的旁注:如果散列在each
调用之间没有改变,Even Hash
将以相同的顺序返回对象。 虽然许多物体都是这样的,但依靠这种微妙之处可能并不是一个好主意。
所以不行。 通用的each
都不会总是以相同的顺序返回对象。
PS Ruby 1.9的哈希现在实际订购了http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash
我没有看过你的实际代码,但这里是你从Ruby API文档中得到的答案:
数组是有序的,任何对象的整数索引集合。
所以,是的,你是偏执狂,但当你正在发展时,这肯定是一件好事吗?
根据定义,数组是元素的有序列表。 所以你应该没有问题。
这取决于具体的Enumerable。 当然,数组总是以明显的顺序迭代。
如果某人实现了以不同方式遍历同一集合的each
方法,那将是非常疯狂的边缘,但这种“特性”的唯一实际限制将是在Enumerable中混合的类的文档中。 那么,在那和实施者的理智。
我几乎可以想象某种加密API,它以一种不可预测的方式故意遍历一个集合。