緯度・経度の値確認のガード節を設けたら、Clippy さんに指摘されてしまいました。
containsの方が分かりやすいよ by Clippy
- Clippy は Rust 標準の linter !
 - 数値が指定した範囲の条件を満たすか
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 は非常に便利なツールです!



コメント