Rubyの&.が便利な件

投稿日時:
Ruby


こういうコードよく見る気がします。


def category_name
  return nil unless article.category_id

  article.category.name
end

記事にカテゴリが付与されている場合はカテゴリ名を返して、付与されてない場合はnilを返すって感じですね。


結構見ることあるんじゃないでしょうか。



ただ、ここで&.を書くことでもっとスッキリ書くことができます。


こんな感じで


def category_name
  article.category&.name
end

&.を使うことでnilチェックを自動で行ってくれます。


自前でnilチェックすることなく安全にメソッドを呼び出すことが出来ます。



ただRuby2.3で追加されたので、それ以下のバージョンだと使えないです。


私も少し前に知ったのですが、よく使う方法の一つです。

また、新しいエンジニアと一緒に仕事をすると、知らなかったと言われることもあり、

特に古くからRubyを触っている人ほど知らない率が高い気がします。



ただ、&.とかtry()は便利ですが、エラーを出なければならないところはエラーにしなければならないので、何でもかんでも&.try()で取得する、というのはちょっと考えたほうがいいですかね〜。



try()とどっち使おうか、という使い分けは微妙なとこですが、違いとしては&.はrubyのメソッド、try()はRailsのメソッドです。


またtry()との違いの簡単な例ですが、

"123"&.to_i # 123
"123"&.to_iiiii # undefined method

"123".try(:to_i) # 123

"123".try(:to_iiiii) # nil


上記のような違いがあり、try()は存在しないメソッドを指定した場合でもnilを返すので、エラーが起こることはないです。