InfoQ: Ruby 1.9 のSymbol#to_procと(入ったばかりの)Procのカリー化

それでもやはり疑問は残る。確かに、

 (1..100).map(&:to_s)

 (1..100).map{|x| x.to_s } 

よりも短く書ける(この例では5文字短かい)。しかし、これは複雑さを増すに見合ったものだろうか? それともやりすぎだろうか?

Ruby 1.9 のSymbol#to_procと(入ったばかりの)Procのカリー化


やりすぎに 1 票。短く書けることよりも理解しやすいことのほうが重要だし、それに (1..100).map(&:to_s) は (1..100).map{|x| x.to_s } より遅い。

Symbol#to_proc の説明をみると、たいがいにおいて Enumerable#map (or collect) を使った例が紹介されている。ということは、Symbol#to_proc は Enumerable#map と一緒に使われることが多いのだろう。

もしそうなら、Enumerable#map を拡張して、第 1 引数に Symbol を指定したときは動作を変えるようにしたほうがわかりやすかった。

(1..100).map(:to_s)  # これは (1..100).map{|x| x.to_s} と同じ


あるいは、Enumerable#apply を用意するとか。これだと Symbol#to_proc を使う方法と違って、メソッド名だけでなく引数も指定できるし、より速い。

module Enumerable
  def apply(method_name, *args)
    self.map {|x| x.__send__(method, *args) }
  end
end

(1..100).apply(:to_s)  # これは (1..100).map{|x| x.to_s } と同じ
(1..100).apply(:+, 1)  # これは (1..100).map{|x| x + 1 } と同じ


もちろん Symbol#to_proc は map 以外でも使えるという利点があるけど、どうせ map 以外ではあまり使われないということであれば、map が短く書けてかつ理解しやすい別の方法のほうがよかった。