Beeeat’s log

Beeeat’s log

プログラミングで出くわした知識やツール、日常生活、働き方その他色々なことをメモしていくブログ

Ruby のコードで見かける「&.」は safe navigation operator (ぼっち演算子)と呼ばれる演算子だった

 普段の業務で Ruby のコードを読んでいると,何箇所かobject&.fooという書き方を見かけました.

初めて見た時は「まぁこういう書き方もあるんだなぁ」とさらっと読んでいましたが,後々,「あれ?結局これどういう意味なんだろ?」と混乱したため今回はこの「&.」とは何かについてまとめていきます.

「safe navigation operator (ぼっち演算子)」

調べてみた結果,「&.」は「safe navigation operator 」と呼ばれる演算子でした. Ruby 2.3.0 がリリースされた時に導入されたメソッドのようです.

www.ruby-lang.org

Ruby の公式ドキュメントを読むと,「ぼっち演算子」とも呼ぶようです...(公式のリファレンスでの名称なんですね...)

docs.ruby-lang.org

「&.」の機能は公式リファレンスを見てみると...

object&.foo という形式のメソッド呼び出し形式が追加されました。
これは object が nil でないときにメソッド foo を呼び出します。

とのことでした.つまりどういうことでしょう?

実際に書いて試してみる

ということで,試しにコードを書いてみました.以下は,Human オブジェクトでgreetingメソッドを実行し,コンソール上に文字列を表示するコードです.まずは「&.」を使わずに実行してみます.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

obj = Human.new
name = "okabeeeat"
puts obj.greeting(name)

なんてことなく文字列が表示されました.

~ » ruby sample.rb
こんにちはokabeeeatさん

次は,objの値をnilにしてみましょう.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

-- obj = Human.new
++ obj = nil 
name = "okabeeeat"
puts obj.greeting(name)

予想通り,NoMethodErrorとなります.

~ » ruby sample.rb
Traceback (most recent call last):
sample.rb:9:in `<main>': undefined method `greeting' for nil:NilClass (NoMethodError)

それでは,objnilの状態で「&.」を使ってgreetingメソッドを実行してみましょう.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

obj = nil
name = "okabeeeat"
-- puts obj.greeting(name)
++ puts obj&.greeting(name)

なんとNoMethodErrorが発生せずに終了しました.公式リファレンスの内容を引用すると,objnilの場合はgreetingメソッドを実行せずに処理が終了したことになります.

~ » ruby sample.rb

どんな場面で使えるのか?

動きはこれでわかりましたが,はたしてどんな時に役に立つのかを考えてみました.

一言で言うとnilをチェックする処理を実装する書く手間が省けることが挙げられます.開発するプロダクトによっては,特定の条件で object がnilになることを考慮して,object の値がnilかどうかをチェックする処理を書く場合があります.

そこで,今回調べた「&.」を利用すると object がnilの場合ならメソッドを実行しないで済むため,object がnilになることでの Error が発生せずに済みます.

まとめと所感

今回は「&.」,「safe navigation operator (ぼっち演算子)」について調べてみました.調べる前は「&.」がなんて呼ばれるものなのかわからず調べるのに少し苦労しましたが,何とか調べることができて良かったです.

「&.」はもっと使い所がある演算子だと思うので,どんな時に役立つかをもう少し意識して,コードを書いてみようと思います.

他にも Ruby を書いてて気になる文法があるので,今回の記事のように気になったら随時まとめていこうと思います.