Enumeratorクラス
ブロック処理するときに使うクラス
使用するにはeachメソッドが必要 each 以外のメソッドにも Enumerable の機能を提供するため
のラッパークラスです。また、外部イテレータ
としても使えます。
Enumerable モジュールは、Module#include 先のクラスが持つ each メソッドを元に様々なメソッドを提供します。例えば Array#map は Array#each の繰り返しを元にして定義されます。 Enumerator を介することにより String#each_byte のような異なる名前のイテレータについても each と同様に Enumerable の機能を利用できます。
Enumerator を生成するには Enumerator.new
あるいはObject#to_enum, Object#enum_for を利用
します。また、一部のイテレータはブロックを渡さずに呼び出すと繰り返しを実行する代わりに enumerator を生成して返します
。
- ブロックを渡さずに呼び出すと繰り返しを実行する代わりに enumerator を生成して返しますとは?
Enumerator オブジェクトを生成、Yielderオブジェクトを引数としてブロック処理が行われる
new(size=nil) {|y| ... } -> Enumerator
Enumerator オブジェクトを生成
して返します。与えられたブロックはEnumerator::Yielder オブジェクトを引数として実行
されます。
生成された Enumerator オブジェクトに対して each を呼ぶと、この生成時に指定されたブロックを実行し、
Yielder オブジェクトに対して << メソッドが呼ばれるたびに、eachに渡されたブロックが繰り返され
ます。
newに渡されたブロックが終了した時点で each の繰り返しが終わります。このときのブロックの返り値が each の返り値となります。
[PARAM] size:
生成する Enumerator オブジェクトの要素数を指定します。 Integer、Float::INFINITY、Proc オブジェクト、nil のいずれかを指定します。Enumerator#size の実行時に参照されます。
irb(main):010* enum = Enumerator.new{|y|
irb(main):011* (1..10).each{|i|
irb(main):012* y << i if i % 5 == 0
irb(main):013* }
irb(main):014> }
irb(main):015> enum.each{|i| p i }
5
10
=> 1..10
Enumerator::Yielder
確かにEnumeratorクラスが生成されている
irb(main):074> (1..10).each_cons(3).class
=> Enumerator
irb(main):075> (1..10).each.class
=> Enumerator
感想
Yielder、proc、block理解できていない
まだ調べる必要がある。