今回はよく使用する 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! よりもおすすめなメソッドがあります。
それは通称 ぼっちメソッドと言われるものです。
ぼっちメソッド
ぼっちメソッドとは、一体何でしょうか。実は、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 |
上記のような結論になります。是非参考にしてみてください