Progrust Library.

// dictionary

範囲式.

範囲式は、0..50..=5のような記法で「範囲」を表す値を作る式です。for式での繰り返しや、配列型ベクタ(Vec)からスライスを切り出す添字指定に使うのが代表例です。..は終端を含まない範囲、..=は終端を含む範囲を表します。開始側は(範囲が空でない限り)含まれます。

fn main() {
    for day in 1..=3 {
        println!("{day}日目"); // 1日目・2日目・3日目
    }
    let prices = [120, 250, 80, 300, 150];
    println!("先頭2件: {:?}", &prices[0..2]); // 終端の位置2は含まない
}
Playgroundで開く

6つの形式

開始・終端の有無と終端を含むかどうかの組み合わせで6形式あり、それぞれstd::opsの別々の型の値になります。

記法 含まれる値
a..b Range a以上b未満
a.. RangeFrom a以上
..b RangeTo b未満
.. RangeFull 全範囲
a..=b RangeInclusive a以上b以下
..=b RangeToInclusive b以下

範囲式は対応する型の値を作る糖衣構文で、たとえば0..10std::ops::Range { start: 0, end: 10 }と同じ値です(The Rust Reference, Range expressions)。

補足

forループで使えるのは開始のある形式だけ

RangeRangeFromRangeInclusiveは、要素が整数型のように「次の値」へ順に進められる型(Stepトレイトの実装型)であればイテレータとして使え、forループに渡せます。開始のないRangeToRangeToInclusiveRangeFullは、どこから数え始めるか決められないためイテレータにはなりません。

開始が終端以上の範囲は空

start..endstart >= endのとき空の範囲です(例: 3..33..2)。一方a..=bは終端を含むため3..=3は空ではなく、空になるのはstart > endのときだけです。空の範囲はイテレータとしては1回も繰り返されないだけでエラーにはなりませんが、スライスの添字では5..2のような開始が終端より大きい範囲や、終端がスライスの長さを超える範囲を渡すと実行時にパニックします。

この辞書が使われているページ

backlinks 8

  1. 辞書for式
  2. 辞書loop式
  3. 辞書スライス
  4. 辞書文字列スライス
  5. 動かして学ぶRustプログラミング問題集 › 第11章 列挙型とmatch式
  6. 動かして学ぶRustプログラミング問題集 › 第3章 制御フロー
  7. 動かして学ぶRustプログラミング問題集 › 第5章 タプルと配列・スライス
  8. 動かして学ぶRustプログラミング問題集 › 第9章 構造体