TechBlogSideCIのエンジニアによる技術ブログです。読むRubyこんにちは、RuboCop大好き!Pockeです。先日、RuboCopのバージョン0.43.0がリリースされました。Requestも11個含まれています。今日はそのCHANGELOGから、気になる新機能を見ていきましょう。新規Cop追加Copとは、RuboCopにおいてひとつのルールを指す言葉です。「インデントが正しいかチェックする」「非推奨メソッドを使っていないかチェックする」などが1つのCopの単位になります。この章では、0.43.0で新たに追加されたCopをひとつずつ紹介します。https://github.com/bbatsov/rubocop/issues/2968このCopはPublicメソッドに対してドキュメントコメントを書くことを促します。method2の部分に下記のような指摘が行われます。method3ではプライベートメソッドを定義しているため、指摘は発生しません。まとめ長く保守していくコードでは、ドキュメントコメントの有無がメンテナンスを行う上で重要となります。コーディング規約としてコメントを書くことを強制したい場合、このCopを有効活用することが出来るでしょう。コメントを書く必要が薄いメソッドも多いためか、このCopはデフォルトでは無効になっています。そのため、このCopを使用したい場合は.rubocop.ymlなどで明示的に有効にする必要があります。operatorが使用できる場合、それを使用することを促します。2.3で新たに追加された演算子です。foo&.barの様に使用します。foo.barのように動作します。foo.bar上記のような文は、全てfoo&.barで代替することが可能です。そのため、上記コードに対して検査を行うと、以下のような指摘が行われます。使用することでコードをシンプルに保つことが可能です。導入してみてはいかがでしょうか。operatorはRuby2.3から追加された演算子であるため、このCopを動作させるには.rubocop.ymlで明示的にRubyのバージョンを指定する必要があります。以下のコードを.rubocop.ymlに追記して下さい。operatorが使用できる場合にそれを使用することを促します。Style/SafeNavigationと異なる点は、ActiveSupportで追加されるtry!メソッドを対象にすることです。解説foo.try!(:bar)例えば、上記のコードはfoo&.barと同等です。そのため、上記のコードを検査すると以下の指摘が行われます。operatorを使うように矯正できるこのCopは有用でしょう。このCopを有効にするには以下のコードを.rubocop.ymlに追記する必要があります。NULL制約がついておりデフォルト値がついていないカラムの追加を検出します。endend上記のようなマイグレーションを実行すると、(使用しているRDBMSにもよりますが)多くの場合エラーが発生してマイグレーションが失敗してしまいます。MySQLを使用している場合にはエラーは出ないものの、既存のレコードのnameカラムに対してはMySQLが勝手にデフォルト値を設定します。そのため、このCopは上記のコードに対して下記の指摘を行います。''のようにデフォルト値を指定する必要があります。まとめ開発時と運用時で異なるRDBMSを使用していたり複数のRDBMSのサポートを行っている場合、このCopは問題の早期発見に役立つでしょう。このCopを有効にするには以下のコードを.rubocop.ymlに追記する必要があります。https://github.com/bbatsov/rubocop/issues/3167このCopは、変数名に数字を含める際のスタイルを統一します。変数名に数字を含める場合、以下のような3通りのケースが考えられます。1このCopを使用することで、この3つのスタイルのうちどれかに統一することが可能です。それぞれ.rubocop.ymlに以下のコードを追記します。non_integerまとめプロジェクトで変数の命名規則が決まっている場合、このCopを有効活用することが出来るでしょう。命名規則が決まっていない場合、以下のコードを.rubocop.ymlに追記することでこのCopを無効にすることが可能です。https://github.com/bbatsov/rubocop/pull/3500このCopは、パフォーマンス上の観点から不要なsortメソッドの呼び出しをsort_byメソッドに置き換えます。解説Rubyには、ソートを行う為のメソッドがsortとsort_byの2つ定義されています。2.3.0)配列の中身をStringに変換した上で辞書式順序でソートしたい場合、sortメソッドでは以下のように書きます。b.to_s}しかし、この書き方では後述するsort_byメソッドより低速になってしまいます。sortメソッドは比較を行う度にブロックを呼び出すため、比較の回数だけto_sが呼ばれてしまいます。sort_byを使用すると、この点を解消することが可能です。array.sort_by(&:to_s)sort_byでは全ての要素に1度ずつしかto_sを呼び出さないため、このケースではsortを使用するよりも高速にソートを行うことが可能となります。このCopを使用して最初に例にあげたコードを検査すると、以下のような指摘を行います。^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^まとめこのCopを使用することで、パフォーマンス上の問題となりうる点を自動的に検出することが可能です。Correct機能に対応しているため、-aオプションを付与してRuboCopを実行することで対象のコードを自動で修正することが可能です。Bignumクラスを参照している箇所を検出します。BignumクラスはIntegerクラスに統合される予定です。Bignumクラスは両者ともIntegerクラスへの参照となります。そのため、Fixnumがコード中に書かれている場合は見た目と挙動が異なり、わかりづらいコードとなってしまいます。このCopはそのような状態を防止するため、Fixnum,Bignumクラスの使用を指摘します。以下のコードに対して以下の指摘を行います。^^^^^^まとめこのCopを使用することで、上記のような紛らわしいコードを検出することが可能です。2.4未満を使用している場合でも有効となっています。Ruby2.4への移行を考えた際にこのCopが有効に働くこと、そもそもFixnumやBignumを使用するケースは少なくIntegerの間違いである可能性が高いこと、が理由です。その他この章では、新規Cop追加以外の新機能を見ていきます。index.htmlの様にRuboCopを実行すると、RuboCopの結果をHTMLとして出力することが可能です。今回のリリースでは、この出力に目次がつくようになりました。筆者はあまりHTMLフォーマッタを使用しないのですが、このフォーマッタをよく使用するユーザーにとっては便利な機能かもしれません。0.43.0ではこの他にも多くの機能追加、バグ修正が行われています。詳しい変更を知りたい方は、リリースノートをご覧ください。0.43.0を利用することが可能です。ルールを見ていこうの会あけましておめでとうございます。