重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

【&:】の後ろにメソッド名を書いたものを見たことがあるんですがこれは何で、どういう動きをするんでしょう?
mapやeachの後ろでよく見る気がします。

A 回答 (2件)

キーワードは「to_proc」です。



[1,2,3].map(&:succ)

[1,2,3].map{|i| i.succ }
と同じです。

「&:」ではなく「& と :succ」ですね。コロンから始まるのは「シンボル」です。
メソッドの引数の頭に「&」が付いていると、Rubyはこれをブロックだと判断します。でも実際はシンボル。
ここで、Rubyが気を利かせて(笑)Symbolクラスのto_procメソッドを呼んでくれます。
これによって

[1,2,3].map(&:succ)

[1,2,3].map{|i| i.succ }
と同じであるということになります。
一応、記述の簡略化のテクニックということになりますね。

詳しくは「to_proc」で検索して下記のような記事を見てもらえれば分かるかと思います。
http://d.hatena.ne.jp/keyesberry/20080917/p1
http://rubyist.g.hatena.ne.jp/muscovyduck/200612 …
http://blog.livedoor.jp/sasata299/archives/51541 …
    • good
    • 0
この回答へのお礼

:はシンボルのマークなんですね。
ブログも教えていただいてありがとうございました!

お礼日時:2011/10/22 15:16

['a', 'b', 'c'].map(&:upcase) みたいなやつね。



1. Enumerable#map はブロックを引数に取ります
http://doc.okkez.net/static/192/method/Enumerabl …

['a', 'b', 'c'].map { ... }

2. メソッドを呼び出しで、ブロック引数の代わりに Proc オブジェクトを渡すことができます
http://doc.okkez.net/static/192/doc/spec=2fcall. …

['a', 'b', 'c'].map(&some_proc)

3. メソッド名のシンボルは & 付きでメソッドに渡された場合、to_proc が自動的に呼ばれます
別にシンボルでなくても、to_proc メソッドを持つ何かであれば何でもいい(Duck Typing)

というわけで、

['a', 'b', 'c'].map(&:upcase) は

['a', 'b', 'c'].map(&:upcase.to_proc) で

['a', 'b', 'c'].map {|c| :upcase.to_proc.call(c) } で、要するに

['a', 'b', 'c'].map { |c| c.upcase }

以前 Rails のライブラリで使われていたのが、Ruby 1.9.x の何処かで本家にマージされたんだと思う。
    • good
    • 0
この回答へのお礼

順を追って説明してくれてありがとうございます。
Rails⇒1.9⇒1.8という感じで追加されたってことでしょうか?前のバージョンを新しくすることもあるんですね!

お礼日時:2011/10/22 15:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!