TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Rust 範囲のシンタックス 「...」VS 「..=」

match | Rust by Example
このサイトでパターンマッチの練習していた時に範囲を表す記法で...を使うと警告が出ました

fn main() {
    let number = 13;

    println!("Tell me about {}", number);
    match number {
        // 単一の値とのマッチをチェック
        1 => println!("One!"),
        // いくつかの値とのマッチをチェック
        2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
        // 特定の範囲の値とのマッチをチェック
        13...19 => println!("A teen"),
        // その他の場合の処理
        _ => println!("Ain't special"),
    }
}
warning: `...` range patterns are deprecated
help: use `..=` for an inclusive range

この例だと13...19は13から19までを表すのですが、13..19と少し違いがわかりづらいです。
13...19は19を含みますが
13..19は19を含みません。

なので19を含む場合は代わりに13..=19と表すことで=がついているので19が含むことが明示できるようになってます。

個人的には..=はとても見やすいなと思います。境界値はいつも含むか含まないか、不安になるのですが、これだと今後不安になることはなくなると思います。

議論されていた記事

`...` vs `..=` for inclusive ranges - ideas (deprecated) - Rust Internals
この記事に書いてありました。

  1. 覚えずらい
  2. We do the opposite of Ruby (because “more dots more numbers” seems strictly better, but still). (Rubyが何とかかんとか...)
  3. タイプミスしやすい
  4. コードが間違っていないかの確認がしやすい

for文での使用例

19を含まない例

for i in 13..19 {
    println!("{}", i);
}

// output
13
14
15
16
17
18

19を含む例

for i in 13..=19 {
    println!("{}", i);
}

// output
13
14
15
16
17
18
19

注意

...は非推奨ですがmatchの時のみ記述できます。
forの時で使用するとエラーが出ます。