• ベストアンサー

【&:】ってなんですか?

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

質問者が選んだベストアンサー

  • ベストアンサー
noname#158634
noname#158634
回答No.1

キーワードは「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/20061222/p1 http://blog.livedoor.jp/sasata299/archives/51541958.html

rinrin_ring
質問者

お礼

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

その他の回答 (1)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.2

['a', 'b', 'c'].map(&:upcase) みたいなやつね。 1. Enumerable#map はブロックを引数に取ります http://doc.okkez.net/static/192/method/Enumerable/i/map.html ['a', 'b', 'c'].map { ... } 2. メソッドを呼び出しで、ブロック引数の代わりに Proc オブジェクトを渡すことができます http://doc.okkez.net/static/192/doc/spec=2fcall.html#block ['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 の何処かで本家にマージされたんだと思う。

rinrin_ring
質問者

お礼

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

関連するQ&A