为什么默认情况下Ruby(2.0 +)中的枚举器不是懒惰的?

时间:2014-02-13 19:44:11

标签: ruby ruby-2.0

为什么Ruby Enumerator默认情况下不像Enumerator::Lazy

是否有人想要使用非懒惰的Enumerator

编辑:

对以下向后兼容性答案的评论,解释了为什么我还不相信:

假设我们已经将这些“突破”更改添加到Ruby 2.0.0,这是一个主要版本,您可以在进行切换之前彻底测试您的代码(特别是如果您要进行生产),不是吗?

修改#2

我怀疑它与效率有关(让我知道是否有什么问题),所以我做了以下基准测试:(当然有些地方懒惰更好。这是为了证明,为什么Ruby不是一直使用懒惰?)

require 'fruity'
require 'prime'

compare do
  lazy { 
    g = Prime::EratosthenesGenerator.new; 1000.times { g.lazy.take(100).to_a } 
  }
  diligent { 
    g = Prime::EratosthenesGenerator.new; 1000.times { g.take(100).to_a } 
  }
end

我得到以下内容:(可能是因为调用.lazy方法而不是从头开始使用Enumerator::Lazy?)

diligent is faster than lazy by 19.999999999999996% ± 1.0%

2 个答案:

答案 0 :(得分:3)

对于任何期望/依赖副作用的代码,使得懒惰的默认值为breaking change

以前对Enumerator的任何使用都需要进行检查和测试。 “最安全”/“理智”的方法只是保持非惰性行为作为默认行为 - 同时提供一个懒惰的替代方案。

一些基本/以前的设计决策不容易被丢弃;早在Ruby 1.8.7之前就支持枚举器。

答案 1 :(得分:2)

可能兼容性。最近引入了惰性枚举器,许多代码依赖于非惰性的枚举器。