Rubyで数値の配列の合計を求める方法
タグ: ruby / 初版公開: 2014-03-25

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

まるで魔法のようだ。

参考