为什么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%
答案 0 :(得分:3)
对于任何期望/依赖副作用的代码,使得懒惰的默认值为breaking change。
以前对Enumerator的任何使用都需要进行检查和测试。 “最安全”/“理智”的方法只是保持非惰性行为作为默认行为 - 同时提供一个懒惰的替代方案。
一些基本/以前的设计决策不容易被丢弃;早在Ruby 1.8.7之前就支持枚举器。
答案 1 :(得分:2)
可能兼容性。最近引入了惰性枚举器,许多代码依赖于非惰性的枚举器。