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