Railsのtryの書き方で気になったのでメモ。
try
メソッドがなくてもエラーにはならずnilを返却する。
ActiveSupport::Tryable#tryなメソッド。
実は中でtry!を実行している。
respond_to?でメソッド使えるか判定してなかったらnilみたいな。
1 2 3 4 5 |
> 1.try(:abs) 1 > 1.try(:abc) nil |
try!
メソッドが存在しないとエラーを吐く
ActiveSupport::Tryable#try!なメソッド。
メソッドの実行はyieldとinstance_evalとpublic_sendで実行しているよう。
1 2 3 4 5 |
> 1.try!(:abs) 1 > 1.try!(:abc) NoMethodError: undefined method `abc' for 1:Fixnum |
&.
アンドマーク(ampersand)とドットの組み合わせ。
Ruby 2.3で追加されました。
Rubyのtryの書き方に不満があったのでしょう。
候補として ?. とか .? があったっぽいですね。
メソッドが存在しないとエラーを吐く
Active Support の try! と似ていますが、メソッド名は文法的に必須であるという点が異なります。2.2.0 以降の変更
だそうです。
中身はよくわからん。
1 2 3 4 5 |
> 1&.abs 1 > 1&.abc NoMethodError: undefined method `abc' for 1:Fixnum |
まぁ比べて見るとぼっち演算子の方がスッキリしてますね。
1 2 3 4 5 6 7 8 |
> { a: 1, b: 2 }&.fetch(:a) 1 > { a: 1, b: 2 }.try(:fetch, :a) 1 > { a: 1, b: 2 }.try!(:fetch, :a) 1 |
あとがき
ぼっち演算子って名前にピンと来ないのは私だけ?
参考
NEWS for Ruby 2.3.0
フィーチャー#11537
The Safe Navigation Operator (&.) in Ruby
スポンサードリンク