このコードに遭遇しました
Enumerator.new((1..100), :take, 5).to_a
# => []
5つの整数の配列ではなく空の配列を返す理由を誰かが知っていますか?
ドキュメントから、Enumerator#new
:
new(obj, method = :each, *args)
2番目の非推奨の形式では、生成された列挙子は、指定された引数が渡された指定されたメソッドを使用して、指定されたオブジェクトを反復処理します。
このフォームの使用はお勧めしません。代わりに、Kernel#enum_forまたはKernel#to_enumを使用してください。
この2番目の使用法(ドキュメントによると使用すべきではありません)には、同様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]