📎

Rustのlintツール「Clippy」に怒られた事例3選

2024/03/20に公開

はじめに

Clippyは、Rustの開発を支援する静的解析ツールです。
コードの冗長性やパフォーマンス、潜在的な問題を検出し、修正を提案してくれます。
初学のため指摘された解析ルールと、修正前後のコード例を3つご紹介します。

インストールと実行方法

  1. Clippyをインストールします。
    $ rustup component add clippy
  2. Cargoプロジェクトでlintを実行します。
    $ cargo clippy

解析ルールと修正例

【1】redundant_field_names

構造体を作成する際、フィールド名と値にセットする変数名が同じ場合、記述を省略できます。
省略しないと変数名の重複が冗長なため、redundant_field_namesでチェックされます。

修正前

fn set_item(name: &String, price: u32) {   
    let item = Item {
        name: name,
        price: price,
    };
}

修正後

fn set_item(name: &String, price: u32) {   
    let item = Item {
        name,
        price,
    };
}

【2】let_and_return

letで変数を定義し、その変数をそのまま戻り値として関数で返している場合、
不要な変数定義としてlet_and_returnでチェックされます。

修正前

fn add(a: i32, b: i32) -> i32 {
    let value = a + b;
    value
}

修正後

fn add(a: i32, b: i32) -> i32 {
    a + b
}

【3】needless_borrow

needless_borrowは、変数の不要な参照、借用をチェックします。
以下例ではupdate_price()内でselfは参照値で値も変更しないため、
&self.priceでの再参照作成は不要でした。

修正前

struct Item {
    price: u32,
}

impl Item {
    fn update_price(&self, increase: u32) -> u32 {
        &self.price + increase
    }
}

修正後

struct Item {
    price: u32,
}

impl Item {
    fn update_price(&self, increase: u32) -> u32 {
        self.price + increase
    }
}

おわりに

https://rust-lang.github.io/rust-clippy/master/index.html

Clippyには700以上の解析ルールが用意されていますが、ルールは任意に変更可能です。

また、cargo clippy --fixで自動修正することもできますが、
先ずはなぜ警告が出るのかを理解していくことが大切かなと思います。

怒られても、ありがたい指摘として活用していきますー🙏

参考記事

コラボスタイル Developers

Discussion