サーチ…


前書き

Enumeratorは、制御された方法で反復を実装するオブジェクトです。

オブジェクトは、条件が満たされるまでループするのではなく、必要に応じて値を列挙します。ループの実行は、オブジェクトの所有者によって次の値が要求されるまで一時停止されます。

列挙子は無限の値ストリームを可能にします。

パラメーター

パラメータ詳細
yield <<としてエイリアシングされたyieldに応答します。このオブジェクトへの降伏は反復を実装します。

カスタム列挙子

フィボナッチ数の Enumeratorを作成しましょう。

fibonacci = Enumerator.new do |yielder|
  a = b = 1
  loop do
    yielder << a
    a, b = b, a + b
  end
end

fibonacci Enumerableメソッドを使用できるようになりました:

fibonacci.take 10
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

既存のメソッド

eachような反復メソッドがブロックなしで呼び出されると、 Enumeratorが返されます。

これは、 enum_forメソッドを使用して行うことができます。

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

これにより、プログラマはEnumerable演算を作成できEnumerable

each.drop(2).map(&:upcase).first
# => :Z

巻戻し

rewindを使用して、列挙子を再起動します。

ℕ = Enumerator.new do |yielder|
  x = 0
  loop do
    yielder << x
    x += 1
  end
end

ℕ.next
# => 0

ℕ.next
# => 1

ℕ.next
# => 2

ℕ.rewind

ℕ.next
# => 0


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow