:to_s で to_s のシンボル を渡しています。単に to_s と書くとその名前の変数になってしまうので、メソッドを指定するためにシンボルにしています。
& の方はそのメソッドをブロックとして展開することを意味します。これは配列の定義、渡す際の展開の * と同じような関係です。
そのため、&:to_s は to_s メソッドをブロックとして渡すことになります。この時、メソッドのレシーバー(呼び出すオブジェクト)は各要素です。
イメージとしては次のような感じです。
map(& ) はブロック map{|x| } に展開
- その中身は :to_s のメソッド
.to_s
その結果 arr.map(&:to_s) は以下と同じことになります。
arr.map{|x| x.to_s}
2014/08/25 00:54