Rubyの&とRailsの#tryの違い
Rubyの&.
- ruby2.3から追加された新しい演算子
- Safe Navigation Operator(
&.
)
10&.to_s # => "10" nil&.to_s # nil
- レシーバが
nil
でない場合にメソッドを呼び出す - レシーバが
nil
の場合はnil
を返す
Railsの#try
- ActiveSupportで提供されるメソッド
10.try(:to_s) # => "10" nil.try(:to_s) # => nil 10.try(:to_hoge) # => nil
- レシーバがメソッドを呼び出せる場合にそのメソッドを呼び出す
- 呼び出せない場合は
nil
を返す
&.
と#try
の違い
&.
はレシーバがnilじゃないけど呼び出せないメソッドを呼びだそうとした時にNoMethodErrorになります
10.try(:to_hoge) # => nil 10&.to_hoge # => NoMethodError: undefined method `to_hoge' for 10:Integer
hoge = { fuga: 'fuga' } hoge.try(:hogee) # => nil hoge&.(:hogee) # => NoMethodError: undefined method
結論
Railsでレシーバがnilではない時にメソッドを呼び出したいという時はtryを使うのが無難
ちなみにそもそも存在しない変数に対してアクセスしようとした時はtryを使ってもNameErrorになります。
aaaaaaaaa.try(:to_s) NameError: undefined local variable or method `aaaaaaaaa' for main:Object