【问题标题】:REE 1.8.7-2011.03, Is `Enumerator#each` guaranteed to return elements in the same order as `Enumerable#to_a`REE 1.8.7-2011.03,是否保证 `Enumerator#each` 以与 `Enumerable#to_a` 相同的顺序返回元素
【发布时间】:2012-11-29 12:02:54
【问题描述】:

我遇到了一个问题,即来自 ActiveRecord 关联的记录以我没想到的顺序返回。这很容易解决,但是一些已经在生产中的代码假定有一定的顺序,在我的例子中这个顺序很重要——事实上它很关键。

我已经缩小了将旧东西修复到这个基本问题的方法:如果保证“Enumerable#each”在关联上返回一致的 ActiveRecord 记录顺序,那么至少我知道我正在处理一个始终被打破的假设,这是可以修复的。如果不能保证,那我可能会被喷。

所以我的问题是,在 Ruby Enterprise Edition,Release 2011.03 中,Enumerable#each 方法是否以与调用 Enumerable#to_a 相同的顺序返回 Enumerable 中的元素(Object 上定义的函数

我已经从 github 下载了 REE 代码,并查看了此版本的标签(并且我已经验证我在我的开发、登台和生产环境中使用了相同的 Ruby 版本)。问题是我读C不是很好,所以只能说我很有信心顺序是一样的,但是我读C的能力不是很好。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord ruby-enterprise-edition


    【解决方案1】:

    是的,这是有保证的; #to_a 实际上只是收集 #each 的结果并将它们返回到一个新数组中。

    enum_to_a 创建一个新数组,然后将collect_all 作为块参数调用到它自己的eachcollect_all 只是执行rb_ary_push(ary, i);,它将给定的值推送到创建的数组上。在 Ruby 中,这将是:

    array = []
    enum.each {|v| array.push v }
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 2015-04-21
      • 2014-08-14
      • 2011-05-05
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多