Ruby Silverの学習中、第二引数がない時のinjectメソッドが理解できなかったので、自分の知識定着のためにも、ここにまとめる。
Enumerable#inject
リストのたたみこみ演算を行います。
最初に初期値 init と self の最初の要素を引数にブロックを実行します。 2 回目以降のループでは、前のブロックの実行結果と self の次の要素を引数に順次ブロックを実行します。そうして最後の要素まで繰り返し、最後のブロックの実行結果を返します。
要素が存在しない場合は init を返します。
初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要素をブロックに渡します。また要素が 1 つしかなければブロックを実行せずに最初の要素を返します。要素がなければブロックを実行せずに nil を返します。
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html
公式リファレンスによると、「リストのたたみこみ演算」しますよとのこと。
p [2, 3, 4, 5].inject {|result, item| result + item }
=> 14

もふぃ
これはわかる。
2 + 3 + 4 + 5 = 14 でしょ?
[2, 3, 4, 5].inject {|result| result**2}
=> 256

もふぃ
これがわからない!
14 ** 2 = 196 じゃないのか!?
ここでもう一度公式リファレンスを見てみると
要素が存在しない場合は init を返します。
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html
こう書いてあります。
つまり、
[2, 3, 4, 5].inject {|result| p result}
2
2
2
=> 2
[2, 3, 4, 5].inject {|result| p result**2}
4
16
256
=> 256
[2, 3, 4, 5, 6].inject {|result| p result**2}
4
16
256
65536
=> 65536
第二引数がない時は、第一引数で畳み込み演算していました。

もふぃ
なるほどね!
“要素が存在しない場合は init を返します。” ってそういう意味だったのね。
たたみ込み演算の回数は、レシーバのリストの数だけ演算していますね。
参考記事

【Ruby入門】injectの使い方をわかりやすくまとめてみた! | 侍エンジニアブログ
この記事では「 【Ruby入門】injectの使い方をわかりやすくまとめてみた! 」といった内容について、誰でも理解できるように解説します。この記事を読めば、あなたの悩みが解決するだけじゃなく、新たな気付きも発見できることでしょう。お悩みの方はぜひご一読ください。

Ruby の inject(reduce) メソッドを使いこなす - Hack Your Design!
Rubyのイテレータメソッド・injectの使い方を紹介します。合計(sum)の出し方や配列内の要素数をハッシュにして返したり、each_with_objectの使い方などを紹介します。

injectメソッドについて徹底解説!
injectメソッドとは、配列等の要素を一つずつ繰り返してブロック内で要素を注入し処理することが出来るメソッドです。処理の内容が少し分かりにくいメソッドなので、動画を使ってinjectメソッドについて解説します。
広告
リンク

もふぃ
この記事がおもしろかったよ!参考になったよ!と言う方は、購入しなくてもいいので、ワンクリックだけでもよろしくお願いします!
ブログ記事を書く励みになります!
私のブログも応援よろしくお願いします。