Torihaji's Growth Diary

Little by little, no hurry.

ruby経験1週間の人間が rubocopしてみた話

はじめに

みなさん、こんにちは。torihaziです。

今日はRuby経験1週間に満たないこの私が

rubyではお馴染み(らしい)rubocopとかいう人について

調査するとともにその凄さを身をもって知ろう

という趣旨で書いていこうと思います!!

それではltg.

あんた誰。

調べたところ、自分が書いたrubyのコードをチェックしてくれる人だそうです。

コード解析という部類の人ですね。

自身が書いたコードについて、

  • この表記ダメじゃない?
  • ここタイポだよ

とか色々指摘してくれるみたいです。

あんまりひどいと逮捕されちゃいそうですね。

この人と会うには。

この"rubocop"というものは gemを使ってインストールする必要があります。

以下は引用です。この方のものを参考にしてください。

zenn.dev

職質を受けてみた。

では早速職質されてみましょう。

以下は私が書いてみたコードです。

array = ("A".."F").to_a
num = rand(2..4)
a = array.sample(num)
b = array - a
p a.sort,b.sort

これをrubocopに通すためには

対象のrubyファイルがあるディレクトリに移動して

rubocopというコマンドを実行します。

そうすると実行したディレクトリ配下に存在するファイル全てを

調査してくれます。

ちなみに私の結果はこうでした。

root@b19dbd1d07d3:/com/practice_ruby/practice_group# rubocop
Inspecting 1 file
C

Offenses:

random.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment.
array = ("A".."F").to_a
^
random.rb:1:10: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
array = ("A".."F").to_a
         ^^^
random.rb:1:15: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
array = ("A".."F").to_a
              ^^^
random.rb:5:9: C: [Correctable] Layout/SpaceAfterComma: Space missing after comma.
p a.sort,b.sort
        ^
random.rb:5:16: C: [Correctable] Layout/TrailingEmptyLines: Final newline missing.
p a.sort,b.sort
               

1 file inspected, 5 offenses detected, 5 offenses autocorrectable

任意同行求められた感じでしょうか。とりあえず現行犯ではなさそうです。

署で話を聞いてみるとかけられている容疑は以下のようです。

  1. 後述のコメント書いてない罪
  2. シングルクォートで囲っていない罪
  3. カンマの後にスペースない罪
  4. 最後改行してない罪

これだけあれば捕まりそうな気はしますが。

1 について

これは ruby2.3以降から始まったルールだそうです。

文字列リテラルをfreezeさせることでメモリ使用率を削減させる目的があるらしいです。

ただそうさせるには追加で記述するものがあるらしく。

方法はrobocop.ymlに書く方法と対象のrubyファイルに書く2通りがあります。

今回は後者を採用してファイルの最上行に次のように書きます。

# frozen_string_literal: true

この後rubocopを通してみると

root@b19dbd1d07d3:/com/practice_ruby# rubocop
Inspecting 1 file
C

Offenses:

practice_group/random.rb:2:1: C: [Correctable] Layout/EmptyLineAfterMagicComment: Add an empty line after magic comments.
array = ("A".."F").to_a
^
~~~~
残り4つは同じ

1 file inspected, 5 offenses detected, 5 offenses autocorrectable

あら文が変わりました。

コメントの下には空行を開けろだそうです。

Inspecting 1 file
C

Offenses:

~~~~~
残り4つは同じ

1 file inspected, 4 offenses detected, 4 offenses autocorrectable

最下行に注目してください。5 offencesから4 offencesになりました。

この調子で言われたことを直して、完璧にしていってください。

全部やるのはめんどくさいあなたへ。

rubocop -aである程度勝手に直してくれるそうです。

直してくれる対象の基準はその変更が大きな影響を与えないかです。

(この大きな影響というのはごめんなさい。よくわかっていません。)

影響なんていいから直す際はrubocop -Aです。

試しにrubocop -aを実行して対象のファイルを見ると

# frozen_string_literal: true

array = ('A'..'F').to_a
num = rand(2..4)
a = array.sample(num)
b = array - a
p a.sort, b.sort

確かに、全て変わっていますね。

これで最後にrubocopとしてみると

root@b19dbd1d07d3:/com/practice_ruby# rubocop
Inspecting 1 file
.

1 file inspected, no offenses detected

となって、全部OK!!だそうです。

終わりに

いかがだったでしょうか。

rubocop兄ちゃん、なかなかやりますね。

自分が齧ったことのあったPHPではこんなものありませんでした。

(私の知る限り・・・)

みなさんもこの人と仲良くなって、コードの品質を担保していきましょう!!

僕も頑張ります!!