Rubyで数値の配列の合計を求めるにはどうすれば良いだろうか。 ぱっと思いつくのは、変数を用意してeach
で変数に値を加算してゆく方法だ。
a = [123, 456, 789]
sum = 0
a.each{|i| sum += i }
p sum #=> 1368
だが、これではあまりに芸がない。
もう少しマシな方法は、inject
を使う方法だ。 inject
はいわゆる畳み込みを行うメソッドである。
a = [123, 456, 789]
p a.inject(0){|sum, i| sum + i } #=> 1368
少しRubyっぽくなったが、これでも少し冗長に感じる。 Rubyはもっと美しい言語なはずである。
実はinject
は初期値を省略すると配列の先頭の要素が初期値となる。 よって合計を求めるなら初期値は不要だ。
a = [123, 456, 789]
p a.inject{|sum, i| sum + i } #=> 1368
ここまで来たらもうもう一歩であるように思われる。 sum + i
も省略したい。 ようは各要素に対して+
を実行すれば良いのである。
inject(symbol)
はメソッド名を受け取りブロックの代わりにそのメソッドを実行する。 これを使って限界まで洗練すると、配列の合計を求める処理は以下のように書ける。
a = [123, 456, 789]
p a.inject(:+) #=> 1368
まるで魔法のようだ。
参考