Ruby のコードで見かける「&.」は safe navigation operator (ぼっち演算子)と呼ばれる演算子だった
普段の業務で Ruby のコードを読んでいると,何箇所かobject&.foo
という書き方を見かけました.
初めて見た時は「まぁこういう書き方もあるんだなぁ」とさらっと読んでいましたが,後々,「あれ?結局これどういう意味なんだろ?」と混乱したため今回はこの「&.」とは何かについてまとめていきます.
「safe navigation operator (ぼっち演算子)」
調べてみた結果,「&.」は「safe navigation operator 」と呼ばれる演算子でした. Ruby 2.3.0 がリリースされた時に導入されたメソッドのようです.
Ruby の公式ドキュメントを読むと,「ぼっち演算子」とも呼ぶようです...(公式のリファレンスでの名称なんですね...)
「&.」の機能は公式リファレンスを見てみると...
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)
それでは,obj
がnil
の状態で「&.」を使ってgreeting
メソッドを実行してみましょう.
class Human def greeting(name) puts "こんにちは#{name}さん" end end obj = nil name = "okabeeeat" -- puts obj.greeting(name) ++ puts obj&.greeting(name)
なんとNoMethodError
が発生せずに終了しました.公式リファレンスの内容を引用すると,obj
がnil
の場合はgreeting
メソッドを実行せずに処理が終了したことになります.
~ » ruby sample.rb
どんな場面で使えるのか?
動きはこれでわかりましたが,はたしてどんな時に役に立つのかを考えてみました.
一言で言うとnil
をチェックする処理を実装する書く手間が省けることが挙げられます.開発するプロダクトによっては,特定の条件で object がnil
になることを考慮して,object の値がnil
かどうかをチェックする処理を書く場合があります.
そこで,今回調べた「&.」を利用すると object がnil
の場合ならメソッドを実行しないで済むため,object がnil
になることでの Error が発生せずに済みます.
まとめと所感
今回は「&.」,「safe navigation operator (ぼっち演算子)」について調べてみました.調べる前は「&.」がなんて呼ばれるものなのかわからず調べるのに少し苦労しましたが,何とか調べることができて良かったです.
「&.」はもっと使い所がある演算子だと思うので,どんな時に役立つかをもう少し意識して,コードを書いてみようと思います.
他にも Ruby を書いてて気になる文法があるので,今回の記事のように気になったら随時まとめていこうと思います.