// dictionary
範囲式.
範囲式は、0..5や0..=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..10はstd::ops::Range { start: 0, end: 10 }と同じ値です(The Rust Reference, Range expressions)。
補足
forループで使えるのは開始のある形式だけ
Range・RangeFrom・RangeInclusiveは、要素が整数型のように「次の値」へ順に進められる型(Stepトレイトの実装型)であればイテレータとして使え、forループに渡せます。開始のないRangeTo・RangeToInclusive・RangeFullは、どこから数え始めるか決められないためイテレータにはなりません。
開始が終端以上の範囲は空
start..endはstart >= endのとき空の範囲です(例: 3..3や3..2)。一方a..=bは終端を含むため3..=3は空ではなく、空になるのはstart > endのときだけです。空の範囲はイテレータとしては1回も繰り返されないだけでエラーにはなりませんが、スライスの添字では5..2のような開始が終端より大きい範囲や、終端がスライスの長さを超える範囲を渡すと実行時にパニックします。
この辞書が使われているページ
backlinks 8