「&.(アンド ドット)」と「try」の違い

【結論】

・「&.(アンド ドット)」と「try」は
 どちらもレシーバーがnilの時に、
 「NoMethodError」ではなく、
 「nil」を返してくれる機能

・「&.(アンド ドット)」は、そもそもメソッドが
 定義されていない場合には、エラーを返す。

・「try」は、メソッドが定義されていない場合でも、
 エラーにはならずnilを返す。

【目次】

【本題】

nilClassによるNoMethodErrorを防ぐ手段

"1 2 3".split
=> ["1", "2", "3"]

nil.split
=> NoMethodError (undefined method `split' for nil:NilClass)

上記の様に、NilClassに定義されていないメソッドを
nilに対して使用した場合、NoMethodErrorのエラーが返ります。

しかしそういったエラーを出したく無いケースも存在します。
そういった場合に利用できるのが、
「&.(アンド ドット)」と「try」です。

「&.(アンド ドット)」について

「&.(アンド ドット)」は、ruby演算子です。

nil&.split
=> nil

「try」について

ActiveSupportで提供されているメソッドです。

nil.try(:split)
=> nil

それぞれの違い

それぞれの違いは、メソッドが呼び出し可能かを判断して処理を返す点です。

「try」はメソッドが呼び出し可能かまで判定するので、
メソッドが定義されていない場合でも、 エラーにはならずnilを返す。

「&.(アンド ドット)」は、レシーバがnilかの判定しかしないので、
メソッドが定義されていない場合には、エラーを返します。

nil.try(:undefined)
=> nil

nil&.undefined
=> NoMethodError: undefined method