単項アンパサンド

このようなエレガントなデザインがRubyでどのように機能するかを説明します。



User.all.map &:name #    
      
      





の代わりに



 User.all.map { |user| user.name }
      
      





最初は、これは列挙型クラスのプロパティのようですが、実際にはそうではありません。



マジック#1。



rubyがメソッド呼び出しの最後の引数でアンパサンド(&)に遭遇すると、

次に、実行可能コードブロック(Proc)に変換しようとします。 例:



 a = (1..10).to_a a.map { |n| n*n } # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] l = lambda { |n| n*n } a.map &l # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
      
      







マジック#2。



Rubyでアンパサンドが検出されると、#to_procメソッドを呼び出してオブジェクトを実行可能ブロックに変換します。



そして、ここで彼は、Symbolで#to_procを呼び出す主な驚きです。次のコードブロックを取得します。



 lambda { |x| x.send(self) }
      
      







つまり、Symbol#to_procは、このフォームのSymbolクラスで既に定義されているため、期待どおりのブロックを正確に返します。



UPD。 例



このSymbolプロパティは、オブジェクトをパラメーターとして置き換えてメソッドを呼び出す素晴らしい機会を提供します:



 :upcase.to_proc.call "asdad" # => "ASDAD"
      
      







関連資料



blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand

weblog.raganwald.com/2008/06/what-does-do-when-used-as-unary.html

en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#The_ampersand_.28.26.29

m.onkey.org/let-s-start-with-wtf



All Articles