使い所が掴めなかったので、簡単にreduceメソッドについてまとめます。
別名でinjectメソッドとしても使えますが、今回はreduceメソッドとして統一しておきます。
reduceメソッドとは
たたみ込み演算を行うメソッドです。
初期値と最初の要素をブロックに渡して実行します。
使い方
先頭の要素と引数の値をブロック内で処理して、繰り返し処理することで結果を返します。
p [2,3,4,5].reduce(0) { |sum, i| sum + i } #=> 14
この場合では、sumに引数の0
が入り、iに最初の要素2
が入ります。
その後、sumに最初の処理した結果が入り、iには次の要素3
が入ります。
これを繰り返すことで結果の14
が出力されます。
((((2) +3) +4) +5)
というイメージです。
また、初期値が0
である場合は省略が可能です。
※追加
初期値が0の時は少し挙動が異なります。
最初に先頭の要素と 2 番目の要素をブロックに渡します。
詳しくは@nodai2h_ITCさんのコメントを参照ください。
p [2,3,4,5].reduce { |sum, i| sum + i } #=> 14
さらに、シンボルと演算子で省略して定義することもできます。
p [2,3,4,5].reduce(:+) #=> 14
ですが、この定義はRuby2.4以降はsum
で定義することもできるようになりました
p [2,3,4,5].sum #=> 14
また、sum以外でもmapやselectでもreduceで表現することができます。
初期値は何でも良い
先の例では初期値を0
で設定しましたが、それ以外のオブジェクトを設定することもできます。
例えばarry
を設定した場合です。
def map(list, &fn)
list.reduce([]) { |a, i| a.push(fn[i]) }
end
p map([2,3,4]) { |i| i * 2 } # => [4, 6, 8]
# 引用:https://techracho.bpsinc.jp/hachi8833/2021_02_03/57968
この例ではmapメソッドで示していますが、selectメソッドやfindメソッドでも定義することができます。
まとめてみて
使い方によってはmapメソッドなどと同じような使い方ができるのがわかりましたが、その分まだ応用的に使えそうです。
繰り返し行う処理ではreduceメソッドを使用した方が端的にかける場合があるので、活用していきたい。
参照
何度見てもよく分からないreduceメソッドをマスターする!
Enumerable#inject
Ruby の inject(reduce) メソッドを使いこなす
Ruby: Enumerableをreduceで徹底理解する#1 基本編(翻訳)
Ruby Enumerableモジュールを理解して繰り返し処理を書く際の選択肢を増やす