inject メソッドの使い方

今までスルーしてた、inject メソッドについて。

リファレンスによると、

inject([init]) {|result, item| ... } (ruby 1.7 feature)
最初に初期値 init と self の最初の要素を引数にブロック を実行します。2 回目以降のループでは、前のブロックの実行結果と self の次の要素を引数に順次ブロックを実行します。そうして最 後の要素まで繰り返し、最後のブロックの実行結果を返します。

http://www.ruby-lang.org/ja/man/html/Enumerable.html

だそうです。よくわからなかったので、実際にやってみます。

初期値がある場合

ary = [ 1, 2, 3, 4, 5 ]
p ary.inject(0) { |result, item| result + item }
→15

  • 初期値(0)と、最初の引数(ary の最初の要素)がブロックに渡される
  • ここでは、result に 0、item に 1が渡される

初期値がない場合

ary = [ 1, 2, 3, 4, 5 ]
p ary.inject { |result, item| result + item }
→15

  • 初期値を省略した場合は、最初の引数(ary の最初の要素)と二番目の引数がブロックに渡される
  • ここでは、result に 1、item に 2が渡される


ということらしいです。なるほど。
ちなみに、いつも使ってるような each で書くとこんな感じ。

each で同じように書く場合

result = 0
ary = [ 1, 2, 3, 4, 5 ]
p ary.each { |i| result += i }

result とかいう変数を宣言しなくてよい分、ソースもすっきりするし、inject のほうがいいかも。