Rubyの&.とRailsのActiveSupportで提供されている#tryの違いについてメモ。
##両者の共通点
レシーバーが nil のとき,NoMethodErrorを投げずにnilを返してくれる機能。
コードでみてみると、
&.について
10&.to_s # => "10"
nil&.to_s # nil
tryについて
10.try(:to_s) # => "10"
nil.try(:to_s) # => nil
どちらもレシーバがnilの場合にnilを返せる。
##違いはなんなのか
両方とも レシーバがnilではない場合にメソッドを呼び出す という目的は同じであるが、 #try
は メソッドが呼び出すことができるときに、メソッドを呼び出す。
コードで見てみると、
10.try(:hoge) # => nil
#10にはhogeメソッドが定義されていない場合、nilを返す
10&.hoge # => Error: undefined method `hoge' for 10:Fixnum (NoMethodError)
定義されていないものを呼び出そうとした時、#try
はnilを返してくれますが、 &.
はエラーを吐く。