0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Enumeratorクラスとは

Posted at

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理解できていない
まだ調べる必要がある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?