范围(Range)表达式

Rust支持范围操作符,有以下几种表示范围的操作符:

范围表达式类型表示的范围
start..endstd::ops::Rangestart ≤ x < end
start..std::ops::RangeFromstart ≤ x
..endstd::ops::RangeTox < end
..std::ops::RangeFull-
start..=endstd::ops::RangeInclusivestart ≤ x ≤ end
..=endstd::ops::RangeToInclusivex ≤ end

例如,1..5表示1、2、3、4共四个整数,1..=5表示1、2、3、4、5共五个整数。

需注意的是其中表示全范围的表达式..,它表示可以尽可能地生成下一个数,直到无法生成为止。

在生成Slice的时候,需要使用到范围表达式。例如,从数组生成Slice:

#![allow(unused)]
fn main() {
let arr = [11, 22, 33, 44, 55];
let s1 = &arr[0..3];    // [11,22,33]
let s2 = &arr[1..=3];   // [22, 33, 44]
let s3 = &arr[..];      // [11, 22, 33, 44, 55]
}

范围表达式也常被用于迭代操作。例如for语句:

#![allow(unused)]
fn main() {
for i in 1..5 {
  println!("{}", i);  // 1 2 3 4
}
}

另外,范围表达式和对应类型的实例是等价的。例如,下面两个表示范围的方式是等价的:

#![allow(unused)]
fn main() {
let x = 0..5;
let y = std::ops::Range {start: 0, end: 5};
}