呼び出しの最後の引数にプレフィックスを付けると、通常の&
引数ではなくブロックを送信していることを明確にしています。inはprocではなくシンボルであるため、Ruby はこのメソッドを自動的に呼び出して実際のブロックを取得します。そして、Rails の連中 (そして今ではバニラ Ruby も) は、巧妙に次のように定義しました。method(&:something)
:something
to_proc
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]