mapやeachのような、複数の要素に対しアクションを起こしてくれるのはEnumerableモジュールです。
実際にmapメソッドで確認をとると
> (65..70).map #=> #<Enumerator: 65..70:map>
と出て来ます。
EnumeratorはEnumerable の機能を提供するためのラッパークラスです。
さて、このブログでは何度か
> (65..70).map(&:chr) #=> ["A", "B", "C", "D", "E", "F"]
なんて書き方を何度か紹介しています。
この例ですと、
65〜70までの数値をアスキー文字化し配列にぶっ込む
という挙動をします。
では、この例を元に表題の「&:」について考えて行きます。
「&」は毎度お馴染み、ブロックを渡す子です。
「:」はSymbolクラスです。
というわけで、上記のスクリプトは以下と同じ意味合いを持ちます。
> (65..70).map {|i| i.chr } #=> ["A", "B", "C", "D", "E", "F"]
もっと冗長に書くと
> proc = Proc.new {|p| p.chr} #=> #<Proc:0x007fb8dd862818@(irb):66> > (65..70).map(&proc) #=> ["A", "B", "C", "D", "E", "F"]
段々分かって来た感じです。
次回の記事では、どのようにして各メソッドが「:」で呼び出されているかについて調査していきます。