Nobody dies a virgin

映画/音楽/時々プログラミング

気になっていたRailsの表現

array.map(&:method)

まずmapメソッドは配列に対してブロックを実行して、新しい配列を作るメソッドになります。

numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.map {|item| item.to_i(16) }

=> [104, 101, 108, 108, 111]

注: to_iメソッドで16進数に変換しています。

これを先の方法で書き換えてみると、

numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.map(&:to_i(16) )

=> [104, 101, 108, 108, 111]

となります。短くかけていいですよね。 具体的に説明すると、まずこれはto_iというメソッドをシンボル型で渡しています。 単純に(to_i)みたいな形で書いてしまうと変数として扱われてしまうので、シンボル型で渡すことでメソッドとして扱われます。 さらに&と記述することでブロックとして展開されます。

map(&)

を見かけたら、 頭の中で

map{|x| }

に変換し、

:to_i

を見たら

map{ |x| x.to_i}

の中の.to_i部分を意味していると変換してみましょう。 頭の中で常に変換すると、英語を読むみたいにコード読めるようになる(はずです) ブロックはRailsでは必須のイディオムですが、map {|item| item.to_i(16) }の書き方は少々長くなってしまうので積極的に&:を使っていきたいですね。