suzunedev's blog

@suzunedev のブログ

RuboCop の Style/SafeNavigation について

はじめに

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 のルールを適用するか迷います。