在 Rust 中,Range
是一种迭代器类型,它生成一系列按顺序排列的数字。Range
通常用于 for
循环中,提供了一种简便的方式来执行重复操作一定次数的任务。
这里有两种最常用的 Range
类型:
-
Range
(start..end
): 创建一个从start
到end
(不包括)的迭代器,也就是左闭右开的区间。 -
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,因此提供了所有迭代器的标准方法,如 map
, filter
, fold
, 和 collect
等。