Range 类型

时间:2024-02-18 13:48:53

在 Rust 中,Range 是一种迭代器类型,它生成一系列按顺序排列的数字。Range 通常用于 for 循环中,提供了一种简便的方式来执行重复操作一定次数的任务。

这里有两种最常用的 Range 类型:

  1. Range (start..end): 创建一个从 start 到 end(不包括)的迭代器,也就是左闭右开的区间。
  2. RangeInclusive (start..=end): 创建一个从 start 到 end(包括)的迭代器,闭区间,包含结束值。

创建 Range:

Range 通过使用两个点 .. 运算符来创建:

let a = 0..5; // 这将包括整数 0, 1, 2, 3, 4

for i in a {
    println!("{}", i); // 打印 0 到 4。
}

创建 RangeInclusive:

RangeInclusive 通过使用三个点 ..= 运算符来创建:

let b = 0..=5; // 这将包括整数 0, 1, 2, 3, 4, 5

for i in a {
    println!("{}", i); // 打印 0 到 5。
}

这两种类型都是迭代器,可以使用它们的 next 方法来逐个获取值,或者使用 for 循环来遍历这些值。

常用方法

Range 类型支持很多操作方法,下面列举几个常用的。

rev

rev 方法可以用来反转范围,创建一个新的迭代器,它会按照相反的顺序产生数值。

let range = (1..10).rev();
for num in range {
    println!("{num}"); // 将从 9 递减到 1
}
count

返回迭代器中剩余的元素数量。

let range_cnt = (1..100).count();
println!("{range_cnt}"); // 输出: 99
start_bound 和 end_bound

返回Range的起始边界和结束边界。返回的是一个Bound枚举,可以是Included(包含边界值)或Excluded(不包含边界值)。

let range = 1..100;
println!("{:?}", range.start_bound()); // 输出: Included(1)
println!("{:?}", range.end_bound());   // 输出: Excluded(100)
contains

判断一个指定的数值是否在Range内。如果是start..end类型的Range,会判断这个值是否大于等于start且小于end

let range = 1..100;
println!("{}", range.contains(&50));  // 输出: true
println!("{}", range.contains(&100)); // 输出: false
next

迭代Range并返回下一个值,如果迭代已经完成则返回None

let mut range = 1..3;
assert_eq!(range.next(), Some(1));
assert_eq!(range.next(), Some(2));
assert_eq!(range.next(), None);
last

返回Range中的最后一个数值,对 start..end 类型的Range来说,这个值是end - 1

let range = 1..100;
println!("{}", range.last().unwrap()); // 输出: 99
nth

获取迭代器中的第n个元素,并且将迭代器前进到此位置后面的元素。

let mut range = 1..100;
println!("{}", range.nth(49).unwrap()); // 输出: 50,即第50个元素
step_by

创建一个每n个数值产生一次的迭代器。

let range = (0..10).step_by(3);
for num in range {
    println!("{num}"); // 输出: 0, 3, 6, 9
}
其他

这个只列举了最常用的一些方法,Range 还支持很多其他的方法,此外,由于 Range 和 RangeInclusive 实现了 Iterator trait,因此提供了所有迭代器的标准方法,如 mapfilterfold, 和 collect 等。