[Rustのはじめ方] Part30: clippyとfmtによるコード整形とLint

Rust

Rustの開発体験を向上させるための強力なツール、rustfmtClippy を紹介します。これらのツールは、コードの一貫性を保ち、潜在的なバグや改善点を早期に発見するのに役立ちます。😊

1. rustfmt: コードを美しく整形 🎨

rustfmt は、Rust公式のコードフォーマッタです。チーム開発や個人開発において、コードのスタイルを統一し、可読性を高めるために非常に重要です。

インストール

rustfmt は通常、Rustのインストール時に一緒にインストールされますが、もし入っていない場合や最新版にしたい場合は、rustup を使って簡単に追加できます。

rustup component add rustfmt

基本的な使い方

プロジェクトのルートディレクトリで以下のコマンドを実行すると、プロジェクト内のすべてのRustコードが整形されます。

cargo fmt

例えば、以下のようなインデントがバラバラなコードがあったとします。

fn main(){
println!("Hello, world!");
        let x = 5;
}

cargo fmt を実行すると、次のように整形されます。

fn main() {
    println!("Hello, world!");
    let x = 5;
}

設定ファイルによるカスタマイズ

プロジェクトのルートに rustfmt.toml または .rustfmt.toml という名前の設定ファイルを作成することで、フォーマットのルールをカスタマイズできます。例えば、1行の最大文字数を変更したり、インデントのスタイルを変えたりすることが可能です。

# rustfmt.toml の例
max_width = 100
use_small_heuristics = "Max"
# 他にも多くの設定があります。詳細は公式ドキュメントを参照してください。
# https://rust-lang.github.io/rustfmt/

利用可能な設定オプションは rustfmt --help=config で確認できます。

rustfmtを使うメリット

  • コードの一貫性: プロジェクト全体で統一されたスタイルを保てます。
  • レビューの効率化: スタイルに関する議論が減り、本質的なコードレビューに集中できます。
  • 可読性の向上: 整形されたコードは読みやすくなります。

コミット前に cargo fmt を実行する習慣をつけると良いでしょう👍

2. Clippy: コードの静的解析とLinting 🧐

Clippy は、Rustのコードに対してより高度な静的解析を行うリンターツールです。一般的な間違いや非効率なコード、非慣用的な書き方を検出し、改善のための提案をしてくれます。

インストール

Clippyrustup で簡単にインストールできます。

rustup component add clippy

基本的な使い方

プロジェクトのルートディレクトリで以下のコマンドを実行します。

cargo clippy

Clippy はコンパイルプロセスの一部として実行され、コードの問題点を指摘します。

Clippyが指摘する一般的なパターン例

Clippyは多くのLint(検査ルール)を持っています。以下はその一部です。

  • if true { ... } のような冗長なコード
  • vec.iter().cloned().collect::<Vec<_>>() より効率的な vec.to_vec()
  • ループ内での不要な .clone()
  • OptionResult の非慣用的な扱い
  • C言語風の for ループ(Rustらしいイテレータが使える場合)
// Clippyが警告を出す例
fn main() {
    let v = vec![1, 2, 3];

    // clippy::needless_range_loop: この書き方はC言語風
    for i in 0..v.len() {
        println!("{}", v[i]);
    }

    // clippy::manual_flatten: flatten() を使う方が簡潔
    let nested = vec![Some(1), None, Some(3)];
    let mut flattened = vec![];
    for opt in nested {
        if let Some(x) = opt {
            flattened.push(x);
        }
    }
    println!("{:?}", flattened);
}

上記のコードに対して cargo clippy を実行すると、よりRustらしい書き方を提案してくれます。

警告レベルの調整

特定のLintを無効化したり、警告レベルを変更したりすることができます。

  • ソースコード内で: #![allow(clippy::lint_name)]#[allow(clippy::lint_name)] のように属性を使って指定します。
  • 設定ファイルで: プロジェクトルートに clippy.toml を作成するか、Cargo.toml 内で設定します。
// ソースコード内で特定のLintを許可する例
#![allow(clippy::needless_range_loop)]

fn main() {
    let v = vec![1, 2, 3];
    // このループでは警告が出なくなる
    for i in 0..v.len() {
        println!("{}", v[i]);
    }
}

ClippyのLintはいくつかのカテゴリ(correctness, suspicious, style, complexity, perf, pedanticなど)に分類されており、カテゴリごとにレベルを設定することも可能です。

Clippyを使うメリット

  • バグの早期発見: よくある間違いや潜在的な問題を検出します。
  • コード品質の向上: より効率的で慣用的なRustコードを書くためのヒントを得られます。
  • パフォーマンス改善: パフォーマンスに影響を与える可能性のあるコードを指摘します。
  • 学習ツールとして: Rustのベストプラクティスを学ぶのに役立ちます。

3. 統合的な使い方 🤝

rustfmtClippy は、開発ワークフローに組み込むことで真価を発揮します。

  • CI/CDでの活用: GitHub ActionsなどのCI/CDパイプラインで cargo fmt --checkcargo clippy -- -D warnings を実行し、コードスタイルやLintエラーがないことを自動的にチェックします。
  • エディタ連携: VSCodeなどのエディタで rust-analyzer 拡張機能を使うと、ファイルを保存するたびに自動で rustfmt を実行したり、エディタ上に Clippy の警告を表示したりできます。これにより、コーディング中にリアルタイムでフィードバックを得られます。

4. まとめ 🚀

rustfmtClippy は、Rust開発者にとって欠かせないツールです。

  • rustfmt でコードの見た目を整え、一貫性を保つ。
  • Clippy でコードの品質を高め、バグを未然に防ぐ。

これらのツールを積極的に活用して、より快適で生産的なRustプログラミングライフを送りましょう!🎉

コメント

タイトルとURLをコピーしました