カテゴリー:
Ruby
タグ:
 Ruby inject

このエントリーをはてなブックマークに追加
更新日時:
2014年04月14日(月)
作成日時:
2013年02月19日(火)

前の記事 / 次の記事

今更injectの存在に気付いてみる。
初期値を設定出来るeachメソッドと考えればいいのかも。

prices = [100, 200, 300, 400, 500]

sum = 0
prices.each do |price|
  sum += price
end

puts sum

みたいな処理を

prices = [100, 200, 300, 400, 500]

prices.inject(0) do |sum, price|
  sum += price  # 最後に評価された値が次のsumの値になる
end

puts sum

と書ける。

この時、 最後に評価された値が次のsumの値になるので、
必ず最期にsumである値を評価する必要がある。

つまり次のように書いても同じ。

prices.inject(0) do |sum, price|
  sum + price
end

今回の例の場合は、

prices = [100 200 300 400 500]
puts prices.sum

とした方が簡潔だし、文字列の場合は

words = ["Today", "is", "snowy", "day."]
puts words.join("\s")

等とした方が簡潔だったりと、他に便利なメソッドがあってなかなか出番がないのだけど、
初期値をループの外で設定するのが怠いと感じたらきっとその時がinjectの出番。