Ruby の map reduce

世の中 map reduce 大流行。
Ruby では map は頻繁に使うけど reduce って使ったことない。

と思って調べたら reduce って inject のことか。なーんだ。

そう言えば map も collect って名前持ってたね。

Ruby 的な名前 一般的な名前
collect map
inject reduce

rubyist には map 派と collect 派がいるらしいが、reduce 派というのは聞いたことないなぁ。

昔 matz さんが「Enumerable は -ect って名前のメソッドで揃えてある」って言ってたような気がする。*1

(0..9).to_a                 # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# -ect
(0..9).collect{|i|i*2}      # => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(0..9).select{|i|i%2==0}    # => [0, 2, 4, 6, 8]
(0..9).reject{|i|i%2==0}    # => [1, 3, 5, 7, 9]
(0..9).inject{|s,i|s+=i}    # => 45
(0..9).detect{|i|i*2>9}     # => 5

# 同じメソッド
(0..9).map{|i|i*2}          # => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(0..9).find_all{|i|i%2==0}  # => [0, 2, 4, 6, 8]
                            # reject はない?
(0..9).reduce{|s,i|s+=i}    # => 45
(0..9).find{|i|i*2>9}       # => 5

*1:collect inject は Smalltalk 由来で、map reduce は Lisp 由来らしい。