🤔
nilガード(Safe Navigation Operator)は初心者の味方...か?
状況
- 本日、どうしてもエラーが返ってきてどうすればいいのか悩んでいた現象がありました。
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