【Ruby3.x】Enumerator::with_object()メソッドの使い方
with_objectメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
with_objectメソッドは、Enumeratorオブジェクトに対して、繰り返し処理を行う際に常に同じオブジェクトをブロックに渡せるようにするメソッドです。このメソッドは、引数として任意のオブジェクトを一つ受け取ります。そして、そのオブジェクトを指定されたEnumeratorが生成する要素とともにブロックに渡す、新たなEnumeratorを返します。
このメソッドが返すEnumeratorに対してeachなどのイテレーションメソッドを呼び出すと、ブロックには現在の要素と、with_objectに渡されたオブジェクトの両方が引数として渡されます。これにより、繰り返し処理中に外部の特定のオブジェクトの状態を更新したり、繰り返し処理の結果を集計したりするような場合に、効率的かつ簡潔にコードを記述できます。例えば、複数の要素から最大値を求めつつ、同時に要素の合計値も計算するといった状況で役立ちます。
with_objectは、to_enumなどを用いて明示的にEnumeratorを生成した後に、特定のオブジェクトを繰り返し処理に組み込みたい場合に特に有用です。この機能は、コレクション自体から直接呼び出されるeach_with_objectメソッドと非常によく似ていますが、Enumeratorオブジェクトに対して呼び出される点が異なります。繰り返し処理の柔軟性を高め、ブロック内で共通のオブジェクトを操作したいときに活用されるメソッドです。
構文(syntax)
1numbers = [1, 2, 3, 4, 5] 2collected_items = [] 3 4numbers.each.with_object(collected_items) do |number, collection| 5 collection << number * 2 6end 7 8puts collected_items.inspect 9# => [2, 4, 6, 8, 10]
引数(parameters)
obj
- obj: 各要素を処理する際に、このオブジェクトに渡されます。
戻り値(return)
Enumerator/Object
with_object メソッドは、指定されたオブジェクトを初期値として、各要素に対してブロックを実行しながらイテレーションを行う新しい Enumerator を返します。これにより、ブロック内で渡されるブロック引数(初期値として渡されたオブジェクト)にアクセスしながら、コレクションの各要素を処理できます。