日本の山岳一覧・百名山 API を開発しましたCLICK !

Rust | 数値が指定した範囲の条件を満たすか contains でチェックする

Rust Clippy
  • URLをコピーしました!

緯度・経度の値確認のガード節を設けたら、Clippy さんに指摘されてしまいました。

containsの方が分かりやすいよ by Clippy

  1. Clippy は Rust 標準の linter !
  2. 数値が指定した範囲の条件を満たすかcontainsでチェックする
目次

Clippy – 便利な開発支援ツール

Clippy とは

Clippy とは、Rust 標準の linter です。

Rust のコードを改善させてくれる lint を集めたもので、コードの改善ポイントを丁寧に指摘してくれます。

これが非常に便利で、Rust の知見も得られるという優れもの。

Clippy のインストールと実行

インストールは以下のコマンドでおこないます。

$ rustup component add clippy

実行は以下のコマンドで、Cargo プロジェクトに対して実行することができます。

$ cargo clippy

また、Clippy の提案をそのまま適用してくれるオプションもあります。

$ cargo clippy --fix

数値が指定した範囲の条件を満たすか contains でチェックする

サンプルとして、緯度・経度の値をチェックする処理を実装してみます。

改善前のコード

#[derive(Debug)]
struct Coordinate {
    latitude: f64,
    longitude: f64,
}

fn main() {
    match validate(36.0, 138.0) {
        Ok(coordinate) => {
            println!(
                "latitude: {}, longitude: {}",
                coordinate.latitude, coordinate.longitude
            );
        }
        Err(err) => print!("{}", err),
    }
}

type Error = String;
fn validate(lat: f64, lng: f64) -> Result<Coordinate, Error> {
    // 緯度は-90~90、経度は-180~180なので、不正な値をエラーを返す
    if (lat > 90.0 || lat < -90.0) || (lng > 180.0 || lng < -180.0) {
        return Err("Invalid coordinate.".to_string());
    }

    Ok(Coordinate {
        latitude: lat,
        longitude: lng,
    })
}

このコードで、Clippy を実行すると以下の 2 つの提案が返ってきます。

warning: manual `!RangeInclusive::contains` implementation
  --> src/main.rs:22:8
   |
22 |     if (lat > 90.0 || lat < -90.0) || (lng > 180.0 || lng < -180.0) {
   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `!(-90.0..=90.0).contains(&lat)`
   |
   = note: `#[warn(clippy::manual_range_contains)]` on by default
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains
warning: manual `!RangeInclusive::contains` implementation
  --> src/main.rs:22:39
   |
22 |     if (lat > 90.0 || lat < -90.0) || (lng > 180.0 || lng < -180.0) {
   |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `!(-180.0..=180.0).contains(&lng)`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains

改善後のコード

改善の指摘理由は、より読みやすく表現できるから です。

たしかに、containsという 含む という単語が明記されており、

それを!で否定しているので意味ははっきりと伝わりますね。

#[derive(Debug)]
struct Coordinate {
    latitude: f64,
    longitude: f64,
}

fn main() {
    match validate(36.0, 138.0) {
        Ok(coordinate) => {
            println!(
                "latitude: {}, longitude: {}",
                coordinate.latitude, coordinate.longitude
            );
        }
        Err(err) => print!("{}", err),
    }
}

type Error = String;
fn validate(lat: f64, lng: f64) -> Result<Coordinate, Error> {
    // 緯度は-90~90、経度は-180~180なので、不正な値をエラーを返す
    if !(-90.0..=90.0).contains(&lat) || !(-180.0..=180.0).contains(&lng) {
        return Err("Invalid coordinate.".to_string());
    }

    Ok(Coordinate {
        latitude: lat,
        longitude: lng,
    })
}

まとめ

言語レベルで linter ツールが搭載されているわけなので、使わない理由はないかと。

Clippy は非常に便利なツールです!

参考

Rust Clippy

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次