🤔

nilガード(Safe Navigation Operator)は初心者の味方...か?

2025/01/07に公開

状況

  • 本日、どうしてもエラーが返ってきてどうすればいいのか悩んでいた現象がありました。
article.title
  • 簡単にいうと、「articleがnil(存在しない)なのに、そのオブジェクトのtitleメソッドにアクセスしようとしてエラー」が発生していました。
    • 具体的には:articleがnilを返している
    • nilに対して.titleを呼び出そうとしてエラーが発生
  • そんな時にアドバイスいただきました「&.」をメソッドの前に置くとあら不思議。3時間くらい悩んだ現象に一発で蹴りがつきました。
article&.title

「&.」(=安全演算子)

メソッド呼び出し構文においてレシーバーとメソッド名を結ぶ演算子の一つ「&.」。「.」と違う点は、レシーバーが nil のとき引数の評価もメソッド呼び出しも行わずに nil を返す、ということだけである。 Ruby 2.3 で導入された。俗に「ぼっち演算子」とも呼ばれる。
参照:https://docs.ruby-lang.org/ja/latest/doc/glossary.html

注意点

  • &.(ぼっち演算子)を使ってもエラーになる場合がある。
    • これはメソッド名のスペルミスなどの場合 NoMethodError(そんなメソッドないよ!)とエラーを出す。このような時もnilを返しますと、オブジェクトがnilなのかメソッド名が間違っているのか区別がつかなくなる。これはプログラム構成上大問題で、メソッド名が間違っている場合はバグとなりかねず、またその発見にかなりの時間を費やす可能性すらある(ようです)。
    • 従って、&.(ぼっち演算子)では、メソッド名の誤りについてはエラーを出力する。
  • NoMethodErrorが出た際には試してみようと思うが、何でもかんでも頼るのは違うと思うので、意識して使えるようにしたい。

Discussion