質問: ### 質問内容 ブロックでメソッドを利用する場合、引数に:methodとすることで呼び出すことができると思います。 しかし、場合によっては&:methodにしてプロックにしないと機能しない場合と、どちらでも良い場合があります。 この違いはなぜ生まれるのでしょうか。 あまり理解ができていないので教えていただけると嬉しいです。 ### 該当のソースコード ``` p (1..10).collect(:to_s) #これだけ機能しない。 p (1..10).collect(&:to_s) #=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"] p (1..10).inject(:+) #=>55 p (1..10).inject(&:+) #=>55 ``` ### 使用している環境 ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
回答: Enumerable#injectだけはSymbolを引数にする事ができ、Symbolが引数の場合は、Symbolをto_procした物をブロックの代わりに使うようになるからです。**`inject`以外のメソッドはそのような実装はされていない**ため、ブロックとして引き渡すために`&`が必須になります。 `inject`については1.8.7のときからそのようになっていますが、なぜinjectだけがそうなのか、その他のメソッドにはなぜそうしないのかはわかりませんでした。