Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

「&:」とは結局何なのか調べてみた(その1)

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"]

段々分かって来た感じです。
次回の記事では、どのようにして各メソッドが「:」で呼び出されているかについて調査していきます。