Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > generatorライブラリ > Generatorクラス

class Generator

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

要約

内部イテレータを外部イテレータに変えるためのクラスです。 実装に callcc を使っているので遅いです。

例:

require 'generator'

# Generator from an Enumerable object
g = Generator.new(['A', 'B', 'C', 'Z'])

while g.next?
  puts g.next
end

# Generator from a block
g = Generator.new { |g|
  for i in 'A'..'C'
    g.yield i
  end

  g.yield 'Z'
}

# The same result as above
while g.next?
  puts g.next
end

目次

特異メソッド
new
インスタンスメソッド
current each end? index pos next next? rewind yield

特異メソッド

new(enum = nil) -> Generator[permalink][rdoc]
new(enum = nil) {|g| ... } -> Generator

Enumerable オブジェクトかブロックから Generator オブジェクトを生成します。

ブロックは生成した Generator オブジェクトをブロック引数として呼ばれます。

[PARAM] enum:
Enumerable をインクルードしたオブジェクトを与えます。 enum とブロックを同時に与えた場合は、ブロックは無視されます。

インスタンスメソッド

current -> object[permalink][rdoc]

現在の位置にある要素を返します。next と違い位置は移動しません。

例:

g = Generator.new(['A', 'B', 'C', 'Z'])
p g.current # => 'A'
p g.current # => 'A'
each {|e| ... } -> self[permalink][rdoc]

ジェネレータの要素を引数としてブロックを評価します。self を返します。

end? -> bool[permalink][rdoc]

次の要素がなく、ジェネレータが終わりに達しているなら真を返します。

index -> Integer[permalink][rdoc]
pos -> Integer

現在の位置を返します。

例:

g = Generator.new(['A', 'B', 'C', 'Z'])
p g.pos     # => 0
p g.next    # => 'A'
p g.pos     # => 1
next -> object[permalink][rdoc]

現在の位置にある要素を返し、位置を1つ進めます。

[EXCEPTION] EOFError:
次の要素が無い場合に発生します。

例:

g = Generator.new() do |g|
      ['A', 'B', 'C', 'Z'].each{|s|
        g.yield s
      }
    end
p g.next # => 'A'
p g.next # => 'B'
next? -> bool[permalink][rdoc]

次の要素が存在するなら真を返します。

rewind -> self[permalink][rdoc]

ジェネレータを最初に巻き戻します。self を返します。

例:

g = Generator.new() do |g|
      ['A', 'B', 'C', 'Z'].each{|s|
        g.yield s
      }
    end
p g.next # => 'A'
p g.next # => 'B'
g.rewind
p g.next # => 'A'
yield(val) -> self[permalink][rdoc]

val をジェネレータに渡します。 Generator.new() {|g| ... } のブロックの中でしか呼ぶことができません。 ジェネレータに渡された val は next などで取り出すことができます。

例:

g = Generator.new() do |g|
      n = 0
      loop do
        g.yield n
        n += 1
      end
    end
p g.next # => 0
p g.next # => 1
p g.next # => 2
g.rewind
p g.next # => 0