Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

「&:」とは結局何なのか調べてみた(その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"]

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