14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[初心者必見] tryとtry!の違い + ぼっちメソッド

Last updated at Posted at 2017-04-20

今回はよく使用する try と try! の違いについて、あまり違いを把握していないで、それぞれのメソッドを使っている人もいるのかなと思い、書きました。

まずは、tryメソッドについて書きます。

try

tryメソッドは、 ActiveSupport から提供されているメソッドです。
tryで渡されたメソッドが存在しているのであればそれを呼び出し、なければ nil を返すメソッドです。
まずは実際にtryメソッドを使わないコードを通して見てみましょう。

@event = Event.create(content: 'test')

# 上の content の値を取得したいとします。
@event.content
=> "test"

# しかし、これではもし@event が nil の際に undefined method error が生じてしまいます。
@event = nil
@event.content
NoMethodError: undefined method `content' for nil:NilClass

# 上記のエラー対策には、以下のコードで対応できます。
@event && @event.content

上記を簡単に書けるようにしてくれるのがtryメソッドです。

@event.try(:content)
=> "test"

このように書くとtryメソッドを説明すると、tryメソッド良いな!!早速使ってみよう!!となるのですが、実は弱点もあります。
それはtryメソッドで nil を返した際に、対象のオブジェクトが nil なのか それとも使用したメソッドが nil なのか把握できないことです。
実際のコードで確認してみましょう。

@event = nil
@event.try(:content)
=> nil

# メソッド名が contentのはずが contnt になっている。
@event.try(:contnt)
=> nil

上記のように nil が返りエラーが生じた際に、考えられる原因が複数存在します。
複雑なコードになってくると、上記のようなエラーを特定するのに時間がかかってしまいます。
これを解消できるメソッドとして、try!メソッドが挙げられます。

try!

@event = nil
@event.try!(:content)
=> nil

# メソッド名が contentのはずが contnt になっている。
@event.try(:contnt)
NoMethodError: undefined method `contnt'

このように書くことによって、メソッド名が異なっている際は、 NoMethodError で落とすことが出来ます。
メソッド名が異なる場合は、エラーとして落とした方が良いと思うので、是非 try!メソッドを使ってみましょう。

と言いたいところなんですが、、、実は、try! よりもおすすめなメソッドがあります。
それは通称 ぼっちメソッドと言われるものです。

スクリーンショット 2017-04-20 14.28.12.png

ぼっちメソッド

ぼっちメソッドとは、一体何でしょうか。実は、rubyでtry!と同じ動きをするメソッドです。
ruby2.3から使えるようになりました。
これは、rubyで提供されているものなのでrailsではなくても使用することができます。かつ、rubyで提供されているので、パフォーマンスもtry!よりは良いです。

なぜぼっちメソッドというのかといいますと &.と記述する & が上の写真のぼっち(の子)と似ているからですw
実際のコードで見てみましょう。

@event&.content
=> "test"

@event = nil
@event&.content
=> nil

# メソッド名が contentのはずが contnt になっている。
@event&.contnt
NoMethodError: undefined method `contnt'

まとめ

try try! ぼっちメソッド
対象のオブジェクトが nil nil nil nil
引数のメソッドが存在しない nil undefined method error undefined method error

上記のような結論になります。是非参考にしてみてください:smile:

14
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?