1日1%成長するブログ

毎日成長するために仕事/プライベートで得た学びをアウトプットするブログです

Rubyの&とRailsの#tryの違い

Ruby&.

  • ruby2.3から追加された新しい演算子
  • Safe Navigation Operator(&.)
10&.to_s # => "10"
nil&.to_s # nil
  • レシーバがnilでない場合にメソッドを呼び出す
  • レシーバがnilの場合はnilを返す

Rails#try

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