緯度・経度の値確認のガード節を設けたら、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 は非常に便利なツールです!
コメント