2012-02-27 4 views

答えて

73

&シンボルは、次の引数がメソッドに与えられたブロックとして扱われるべきであることを示すために使用されます。つまり、まだProcオブジェクトでない場合は、to_procメソッドが呼び出されて1つに変換されます。

はこのように、今度は

Post.all.map { |x| x.id } 

と同等です

Post.all.map(&:id.to_proc) 

のようなもので、あなたの例の結果は、だから、Post.allによって返されたコレクションを反復処理し、結果を配列で構築しますすべての項目に対してidメソッドが呼び出されました。

これは、Symbol#to_procがオブジェクトを取得し、そのオブジェクトのシンボル名を持つメソッドを呼び出すProcを作成するためです。これは主に、入力の手間を省くために利便性のために使用されています。

+5

これは当てはまりません。 map(:id.to_proc)は、mapが引数を受け付けないため、ArgumentErrorをスローします。引数としてProcを渡すことは、ブロックを供給することと同じではありません**。 ''と ''は、Procをブロックに変換し、そのオペランドがProcでない場合は、まずto_procを呼び出してからブロックに変換します。 – sepp2k

+0

@ sepp2k:うん、私はそこに '&'を忘れてしまった。 –

+0

あなたの最初の文は、「&x'to'proc'と同じです」というようなものも読んでください。ただしその定義は無限に再帰的です。 – sepp2k

1

これはすべてPostオブジェクトを受け取り、それぞれに対してidメソッドが呼び出された配列を作成します。

つまり、ActiveRecordの場合、データベース内のすべてのPostエンティティに対してid属性の配列が取得されています。

1

これはRubyのトリックです。これは、Rubyがダイナミックな型変換を行うことに依存しています。 Symbol#to_proc trick hereの説明があります。

関連する問題