为什么这个enumerator.to_a会返回[]?

时间:2012-12-03 09:14:48

标签: ruby ruby-1.9

我刚刚遇到这段代码

Enumerator.new((1..100), :take, 5).to_a
# => []

有谁知道为什么它返回一个空数组而不是一个包含5个整数的数组?

1 个答案:

答案 0 :(得分:3)

来自文档,Enumerator#new

new(obj, method = :each, *args)
  

在第二个不推荐使用的表单中,生成的Enumerator会迭代   给定的对象使用给定的方法和给定的参数   过去了。

     

不鼓励使用此表格。使用内核#enum_for或内核#to_enum   代替。

第二种用法(根据文档不应该使用),需要一个类似each的方法(就是它,产生值的方法)。 take 返回值,但不会产生它们,因此您将获得一个空的可枚举值。

请注意,在Ruby 2中,执行惰性take

非常简单
2.0.0dev> xs = (1..100).lazy.take(5)
#=> #<Enumerator::Lazy: #<Enumerator::Lazy: 1..100>:take(5)>
2.0.0dev> xs.to_a
#=> [1, 2, 3, 4, 5]