「&.(アンド ドット)」と「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」です。
「&.(アンド ドット)」について
nil&.split => nil
「try」について
ActiveSupportで提供されているメソッドです。
nil.try(:split) => nil
それぞれの違い
それぞれの違いは、メソッドが呼び出し可能かを判断して処理を返す点です。
「try」はメソッドが呼び出し可能かまで判定するので、
メソッドが定義されていない場合でも、 エラーにはならずnilを返す。
「&.(アンド ドット)」は、レシーバがnilかの判定しかしないので、
メソッドが定義されていない場合には、エラーを返します。
nil.try(:undefined) => nil nil&.undefined => NoMethodError: undefined method