基本機能
ぼっち演算子(&.)は、Ruby2.3.0から導入された機能です。
ぼっち演算子は、レシーバーがnilの場合にエラーを回避し、nilを返します。
RubyやRailsを使っていると、nilにメソッドを実行してしまい、NoMethodErrorなんてことがあると思います。
それを解決してくれるのが、このぼっち演算子です。以下、簡単な使用例です。
# ユーザーが存在しない
current_user = nil
# ぼっち演算子なし
name = current_user.name
#=> undefined method `name' for nil:NilClass (NoMethodError)
# ぼっち演算子あり
name = current_user&.name
#=> nil
Railsでの具体的な使い方
いくつか例を挙げていきます。
ユーザーに紐づく、記事の一覧を取得する例です。
# ユーザーが存在しない
@current_user = nil
# ぼっち演算子なし
@artilces =
if @current_user.present?
@articles = Article.where(user_id: @current_user.id)
else
[]
end
#=> []
# ぼっち演算子あり
@articles = Article.where(user_id: @current_user&.id)
#=> []
少し雑な例ではありますが、データ取得で必要な値が存在しない場合にも簡潔にエラーを回避できる、といった要点だけ押さえていただければ大丈夫です。
次の例は、nil許容のカラムが存在するモデルの作成例です。
# authorはnilも保存可能
@current_user = nil
# ぼっち演算子なし
author_name = @current_user.present? ? @current_user.name : nil
Article.create(title: "テスト記事", author: author_name)
#ぼっち演算子あり
Article.create(title: "テスト記事", author: @current_user&.name)
おそらくどのプロジェクトでもnilを許容するカラムは出てくるので、ぼっち演算子を使うとスマートに書くことができます。
present?メソッドを使っている箇所をぼっち演算子に置き換えてコードを簡潔にできないか、ぜひ確認してみてください。
present?メソッドは、ぼっち演算子の他にもpresenceメソッドを用いるとかなり簡潔に書くことができることもあるので、ぜひ下記の記事も参考にしてみてください。
【Rails】presenceメソッドの使い方とリファクタリング例を紹介!【便利メソッド】
注意点
ぼっち演算子を使ってエラーになるケース
以下のようにレシーバーがnilではないかつ、呼び出すメソッドが存在しない場合はいつも通りのNoMethodエラーとなりますのでご注意ください。
0&.downcase
#=> undefined method `downcase' for 0:Integer (NoMethodError)
ぼっち演算子が不要なケース
nilクラスのメソッドは元々エラーが起きないためぼっち演算子は不要です。
# to_iメソッドはnilクラスに存在するため、ぼっち演算子がなくてもエラーが起きない
nil.to_i
#=> 0
class NilClass (Ruby 3.3 リファレンスマニュアル)
nil のクラス。 nil は NilClass クラスの唯一のインスタンスです。 nil は false オブジェクトとともに偽を表し、 その他の全てのオブジェクトは真です。
練習問題
まとめ
ぼっち演算子についてのまとめ
- レシーバーがnilの場合にエラーを回避し、nilを返す
- レシーバーがnilではないかつ、呼び出すメソッドが存在しない場合は通常通りエラーとなる
- nilクラスに定義されているメソッドは、ぼっち演算子が不要
ぼっち演算子は同じような効果を持つ、tryメソッド、try!メソッドよりも処理速度が速いことが確認されているので、積極的に使っていきたいですね!
「tryメソッド」「try!メソッド」「&.演算子」の違いとは?
tryメソッドとtry!メソッドと&.演算子は似ていますが、使い方を間違えれば大きなバグにつながるかもしれません。それぞれの使い方や動作について理解することでバグなくtryメソッドを使いこなせる様になるので、この記事で使い方をマスターしまし...
引用・参考資料
class NilClass (Ruby 3.3 リファレンスマニュアル)
nil のクラス。 nil は NilClass クラスの唯一のインスタンスです。 nil は false オブジェクトとともに偽を表し、 その他の全てのオブジェクトは真です。
「tryメソッド」「try!メソッド」「&.演算子」の違いとは?
tryメソッドとtry!メソッドと&.演算子は似ていますが、使い方を間違えれば大きなバグにつながるかもしれません。それぞれの使い方や動作について理解することでバグなくtryメソッドを使いこなせる様になるので、この記事で使い方をマスターしまし...
ぼっち演算子とは