2

刚好遇到这段代码

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

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

4

1 回答 1

3

从文档中,Enumerator#new

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

在第二种不推荐使用的形式中,生成的 Enumerator 使用给定的方法迭代给定的对象,并传递给定的参数。

不鼓励使用此表格。请改用 Kernel#enum_for 或 Kernel#to_enum。

这第二种用法(根据文档,您不应该使用它)需要一个类似each的方法(就是这样,一个产生值的方法)。take 返回值,但不产生它们,所以你得到一个空的枚举。

请注意,在 Ruby 2 中,执行 lazy 将非常简单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] 
于 2012-12-03T09:22:31.900 回答