、あなたが通常引数ブロックを送信していないことが明らかになっている&
と呼び出しの最後の引数の前に付けるとき。 OK、method(&:something)
で:something
はprocではないので、Rubyは自動的にto_proc
というメソッドを呼び出して実際のブロックを取得します。そして、(今も、バニラルビー)Railsの男が巧みとしてそれを定義した:あなたが行うことができる理由
class Symbol
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
end
だこと:
>> [1, 2, 3].map(&:to_s) # instead of [1, 2, 3].map { |n| n.to_s }
=> ["1", "2", "3"]
[編集]注:この構造は全く糖衣構文ではないことを実現Rubyが提供する一般的なインフラストラクチャでは、他のクラスのために独自のto_proc
を実装することを止めるものはありません。 &:method
は引数が許可されていないため、制限されていませんでしたか?
class Array
def to_proc
proc { |obj, *args| obj.send(*(self + args)) }
end
end
>> ["1", "F", "FF"].map(&[:to_i, 16])
=> [1, 15, 255]
これは多かれ少なかれ[[ClassOne、ClassTwo] .each(&:my_method) 'を理解する](http://StackOverflow.Com/q/99318/)、[マップRubyではどういう意味ですか?(http://StackOverflow.Com/q/1217088/)、[これはルビーではどういう意味ですか: '&:capitalize'](http://StackOverflow.Com/q/1792683 /)、[Ruby/Ruby on Railsアンパサンドコロンショートカット](http://StackOverflow.Com/q/1961030/)、[Ruby: '&:symbol]構文(http://StackOverflow.Com/q/2096975 /)、[これは最後のRubyコンストラクトと呼ばれていますか?](http://StackOverflow.Com/q/2211751/)、... –
... [あなたは '&:'演算子Rubyで?](http://StackOverflow.Com/q/2259775/)、[このRubyコードで 'map(&:name)'は何をするのですか?](http://StackOverflow.Com/q/2388337/ )、[[:+ 'と'&+ 'とは何ですか?](http://StackOverflow.Com/q/2697024/)とPost.published.collect(&:views_count)の['&:views_count']](http://StackOverflow.Com/q/3888044/) 。 –