0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】reduceメソッド(injectメソッド)の簡単なまとめ

Last updated at Posted at 2023-01-11

使い所が掴めなかったので、簡単に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モジュールを理解して繰り返し処理を書く際の選択肢を増やす

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?