関数プログラミングっぽくmapに2引数関数をカーリー化して渡す
rubyで1引数関数をmapに渡す場合は、こんなかんじでメソッドのシンボルをProcオブジェクトとして渡せて関数プログラミングっぽい書き方ができるんだけど、
irb > ('a'..'c').map &:upcase => ["A", "B", "C"]
2引数になるとどう書けばよいんやろうと思ってたのだけど、パーフェクトRuby読んでたら、9.3章MethodオブジェクトとProcオブジェクトのところにこんな書き方が載ってた。
irb > (0..10).map &2.method(:*).to_proc => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
ぜんぜん直感的じゃないけど、数字の2のインスタンスから乗算メソッド*のMethodオブジェクトを取得して、Procオブジェクトに変換して渡してる。数字の2はMehtodオブジェクトのレシーバとして束縛されてるので、カーリー化したかんじになってる。
ちなみに最後のto_procは省略できるので、以下の書き方でもOKだった。
irb > (0..10).map &2.method(:*) => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
あれっ?Procオブジェクトに変換できるものならいけるということは、これlambdaでもいけるんじゃね?と思って試してみたら出来た。
irb > (0..10).map &->(x){2*x} => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
だいぶ直感的なかんじになった。ちなみに試したのはruby2.2.0です。