RubyonRailsにおけるtryとtry!の違いについて書いておきます。
また、ぼっち演算子とよばれる &.についてもまとめてみました。
tryはActiveSupport
で用いられるメソッドになります。
目次
tryとは
実際に使った例からみていきましょう。
a.try(:phone)
こんな感じで使用します。
で、どんなものなのか理解するために、簡単に言いますと、
レシーバがnilでないなら、メソッドを実行する、というものです。
上記の例でいうと、a
がnil
でないなら:phone
というメソッドを呼び出す、という処理になります。
レシーバというものは、aaa.method
などにおけるaaa
の部分のことです。
“呼び出し元"なんて表現ができるかもしれません。
tryを用いるメリットは、 レシーバの中身がnilかどうかを確かめてからメソッドを呼び出すコードが簡潔にかけることです。
# tryメソッドを使用しない場合 unless @number.nil? @number.next end # tryメソッドを使用した場合 @number.try(:next)
Rails guidesより
try と try!
a.try(:phone)
この例で説明します。
tryとtry!を理解するにあたって知っておいてほしい内容は以下の2つです。
- メソッドが定義されているかどうか
- レシーバがnilかどうか
これらを頭において、それぞれの処理をみていくことにします。
しかし、共通の処理として、2つ目にあげたレシーバがnilかどうか
の返り値はどちらもnil
となります。
a = nil a.try(:phone) => nil a.try!(:phone) => nil
レシーバがnil
であれば、tryとtry!どちらも返り値はnil
です。
try!
try!は、メソッドを持たない場合は、エラーになります。
NoMethodError
が補足可能であるということです。
try
tryは、メソッドを持たない場合は、nil
を返します。
tryにはブロックを渡すことも可能
@person.try { |p| "#{p.first_name} #{p.last_name}" }
by Rails guides
このように {} くくってあげるとブロックで渡すこともできます。
ぼっち演算子
さて、ぼっち演算子と呼ばれる演算子があります。
&.
これです。
これは、try!と同様の処理の演算子になっています。
つまり
a.try!(:phone) a&.(:phone)
は同じです。
参考
Rails guides