Ruby Language
列挙子
サーチ…
前書き
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