はじめに
RuboCop 実行時に以下のメッセージが出力されました。
sample.rb:15:6: C: [Correctable] Style/SafeNavigation: Use safe navigation (&.) instead of checking if an object exists before calling the method. if sample && sample.hello
サンプルコード
class Sample attr_reader :name def initialize(name) @name = name end def hello "hello #{name}" end end if __FILE__ == $PROGRAM_NAME sample = Sample.new("Suzune") if sample && sample.hello puts sample.hello end end
指摘内容は safe navigation operator (ぼっち演算子) のことですが、思い出せなかったため、 あらためて safe navigation operator (ぼっち演算子) を調べてみました。
Style/SafeNavigation について
RuboCop の指摘内容の詳細は以下の document に記載されています。 www.rubydoc.info
オブジェクトのメソッドを呼び出す際にオブジェクト自体が nil の場合に NoMethodError となるため、オブジェクトの存在チェックをしています。
# bar foo && foo.bar # good foo&.bar
safe navigation operator (ぼっち演算子) は Ruby 2.3.0 がリリースされた際に導入された機能でした。 docs.ruby-lang.org
おわりに
サンプルコードを以下のとおりに修正すると RuboCop から指摘されなくなりました。
% diff sample.rb fix_sample.rb 15c15 < if sample && sample.hello --- > if sample&.hello
safe navigation(&.
) を使っていきましょうということですね。
safe navigation(&.
) を覚えていれば修正後のコードの方がスッキリしますが、修正前のコードでも個人的には好きなので RuboCop のルールを適用するか迷います。