ruby中的.each迭代器是否保证每次都在相同的元素上给出相同的顺序?

时间:2011-07-05 23:52:03

标签: ruby arrays iterator

我正在使用列表'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迭代器来使用相同的顺序。

我认为它是一个数组的属性,它有一个固定的顺序,我只是偏执,迭代器不会使用该顺序......

4 个答案:

答案 0 :(得分:15)

这取决于您正在操作的特定Enumerable对象。

例如,数组将始终以相同的顺序返回元素。但是其他可枚举对象不能保证以这种方式运行。一个很好的例子是1.8,7基础哈希。这就是许多框架(最着名的是ActiveSupport)实现OrderedHash的原因。

一个有趣的旁注:如果在Hash次调用之间哈希没有更改,则偶数each将以相同的顺序返回对象。虽然许多物体都是这样的,但依靠这种微妙之处可能并不是一个好主意。

所以,不。通用each并不总是以相同的顺序返回对象。

P.S。现在实际上已经订购了Ruby 1.9的哈希http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash

答案 1 :(得分:7)

我没有查看您的实际代码,但这是您从Ruby API docs获取的答案:

  

数组是有序的,任何对象的整数索引集合。

所以是的,你是偏执狂,但当你正在发展时,这肯定是件好事吗?

答案 2 :(得分:2)

根据定义,数组是元素的有序列表。所以你应该没有问题。

答案 3 :(得分:1)

这取决于具体的Enumerable。当然,数组总是以明显的顺序迭代。

如果有人实现一个以不同方式遍历同一集合的each方法,那将是非常疯狂的边缘,但这种“特征”的唯一实际限制将出现在该类的文档中。混合在Enumerable中。那么,在那和实施者的理智。

我几乎可以想象某种加密API会故意以不可预测的方式遍历集合。