SakuraWi - BLog

みんなのウェディングの新米エンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【RubyonRails】tryとtry!の違い【ぼっち演算子&.とは】


RubyonRailsにおけるtryとtry!の違いについて書いておきます。

また、ぼっち演算子とよばれる &.についてもまとめてみました。

tryはActiveSupportで用いられるメソッドになります。

目次

tryとは

実際に使った例からみていきましょう。

a.try(:phone)

こんな感じで使用します。

で、どんなものなのか理解するために、簡単に言いますと、

レシーバがnilでないなら、メソッドを実行する、というものです。 上記の例でいうと、anilでないなら: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

Active Support コア拡張機能 | Rails ガイド

Ruby の &. と #try の違い - Secret Garden(Instrumental)