Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Enumerable::Enumeratorクラス

class Enumerable::Enumerator

クラスの継承リスト: Enumerable::Enumerator < Enumerable < Object < Kernel

要約

このクラスは Enumerator に置き換えられました。 Enumerable::Enumerator は互換性のために残されています。

each 以外のメソッドにも Enumerable の機能を提供するためのラッパークラスです。 また、外部イテレータとしても使えます。 Ruby 1.9 以降では Enumerable::Enumerator は Enumerator になっています。

Enumerable モジュールは、 Module#include 先のクラスが持つ each メソッドを元に様々なメソッドを提供します。 例えば Array#map は Array#each の繰り返しを元にして定義されます。 Enumerator を介することにより String#each_byte のような 異なる名前のイテレータについても each と同様に Enumerable の機能を利用できます。

Enumerator を生成するには Enumerable::Enumerator.new あるいは Object#to_enum, Object#enum_for を利用します。

目次

特異メソッド
new
インスタンスメソッド
each next rewind with_index

特異メソッド

new(obj, method = :each, *args) -> Enumerable::Enumerator[permalink][rdoc]

オブジェクト obj について、 each の代わりに method という 名前のメソッドを使って繰り返すオブジェクトを生成して返します。 args を指定すると、 method の呼び出し時に渡されます。

[PARAM] obj:
イテレータメソッドのレシーバとなるオブジェクト
[PARAM] method:
イテレータメソッドの名前を表すシンボルまたは文字列
[PARAM] args:
イテレータメソッドの呼び出しに渡す任意個の引数

例:

str = "xyz"

enum = Enumerable::Enumerator.new(str, :each_byte)
p enum.map {|b| '%02x' % b }   # => ["78", "79", "7a"]

インスタンスメソッド

each {...} -> object[permalink][rdoc]

生成時のパラメータに従ってブロックを繰り返します。 生成時に指定したイテレータの戻り値をそのまま返します。

例:

str = "Yet Another Ruby Hacker"

enum = Enumerable::Enumerator.new(str, :scan, /\w+/)
enum.each {|word| p word }              # => "Yet"
                                        #    "Another"
                                        #    "Ruby"
                                        #    "Hacker"

str.scan(/\w+/) {|word| p word }        # => "Yet"
                                        #    "Another"
                                        #    "Ruby"
                                        #    "Hacker"
next -> object[permalink][rdoc]

「次」のオブジェクトを返します。

現在までの列挙状態に応じて「次」のオブジェクトを返し、列挙状態を1つ分進めます。 列挙が既に最後へ到達している場合は、 列挙状態を最初まで巻き戻すとともに StopIteration 例外を発生します。

next メソッドによる外部列挙の状態は他のイテレータメソッドによる 内部列挙には影響を与えません。 ただし、 IO#each_line のようにおおもとの列挙メカニズムが副作用を 伴っている場合には影響があり得ます。

[EXCEPTION] StopIteration:
列挙状態が既に最後へ到達しているとき

[SEE_ALSO] Enumerable::Enumerator#rewind

例1:

str = "xyz"
enum = str.each_byte

str.bytesize.times do
  puts enum.next
end
    # => 120
    #    121
    #    122

例2:

str = "xyz"
enum = str.each_byte

begin
  puts enum.next while true
rescue StopIteration
  puts "iteration reached at end"
end
    # => 120
    #    121
    #    122
    #    iteration reached at end
puts enum.next
    #=> 120

例3: Kernel.#loop は StopIteration を捕捉します。

str = "xyz"
enum = str.each_byte
loop do
  puts enum.next
end
    # => 120
    #    121
    #    122
rewind -> self[permalink][rdoc]

列挙状態を巻き戻します。

next メソッドによる外部列挙の状態を最初まで巻き戻します。 self を返します。

[SEE_ALSO] Enumerable::Enumerator#next

例:

str = "xyz"
enum = str.each_byte

p enum.next # => 120
p enum.next # => 121
enum.rewind
p enum.next # => 120
with_index {|(*args), idx| ... } -> object[permalink][rdoc]
with_index -> Enumerator

生成時のパラメータに従って、要素にインデックスを添えて繰り返します。 インデックスは 0 から始まります。

ブロックを指定した場合の戻り値は生成時に指定したレシーバ自身です。

例:

str = "xyz"

enum = Enumerable::Enumerator.new(str, :each_byte)
enum.with_index {|byte, idx| p [byte, idx] }
    # => [120, 0]
    #    [121, 1]
    #    [122, 2]

生成時のパラメータに従って、要素にインデックスを添えてブロックを繰り返します。 インデックスは 0 から始まります。