【问题标题】:Is the .each iterator in ruby guaranteed to give the same order on the same elements every time?ruby 中的 .each 迭代器是否保证每次都对相同的元素给出相同的顺序?
【发布时间】:2011-09-29 05:29:43
【问题描述】:

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

我会假设它是具有固定顺序的数组的属性,而我只是偏执于迭代器不会使用该顺序...

【问题讨论】:

  • 当你说“list”时,你是指“array”,还是也可以指“set”?
  • 在这种情况下,它是一个数组。不过,我也有一些套装。我想我想知道 .each 是否意味着一个订单,但假设只有一个有序集合才是有序的……

标签: ruby arrays iterator


【解决方案1】:

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

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

所以,是的,你是偏执狂,但在你的发展过程中,这肯定是件好事吗?

【讨论】:

  • 我想我担心的是迭代器可能(出于某种原因?)改变顺序......
【解决方案2】:

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

例如,数组将始终以相同的顺序返回元素。但不能保证其他可枚举对象以这种方式运行。 1.8,7 base Hash 就是一个很好的例子。这就是为什么许多框架(尤其是 ActiveSupport)实现了 OrderedHash。

一个有趣的附注:如果在each 调用之间哈希没有改变,即使Hash 也会以相同的顺序返回对象。尽管许多对象都以这种方式运行,但依靠这种微妙之处可能不是一个好主意。

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

附: Ruby 1.9 的哈希现在实际上是有序的 http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      如果有人实现一个each 方法以不同的方式遍历同一个集合,那将是相当疯狂的边缘,但是对这种“功能”的唯一实际限制是在混入的类的文档中可枚举。好吧,在这方面和实施者的理智。

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

      【讨论】:

      • 对于统计测试来说,随机遍历枚举也很有用...
      猜你喜欢
      • 2020-03-31
      • 2016-07-14
      • 2013-08-20
      • 2019-05-01
      • 1970-01-01
      • 2021-10-21
      • 2015-04-21
      • 2019-03-17
      相关资源
      最近更新 更多