在 Rust 中使用范围(Range):从基本到进阶
在 Rust 中使用范围(Range):从基本到进阶
在 Rust 中,范围(Range)是一种非常实用的功能,用于生成一系列连续的值。可以用它来创建数组、迭代器,甚至在特定的场景下进行高效的计算和操作。今天,我们将探讨 Rust 中范围的几种常见用法,并展示如何通过不同的范围创建数据集合。
1. 半开区间:start..end
首先,我们来看看 Rust 中最常见的范围表达式——半开区间。这种范围包含起始值,但不包括结束值。
let range = 1..10; // 半开区间,包含 1 到 9
let v: Vec<i32> = range.collect(); // 转换为 Vec<i32>
println!("{:?}", v); // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
解释:
- 这里
1..10创建了一个从1到9的范围。它包含1,但不包括10。 collect()方法将这个范围转换为一个Vec<i32>数组。
这种范围非常常见,适用于大多数需要不包括结束值的情况。
2. 闭区间:start..=end
有时希望生成的范围包含结束值。这时,可以使用闭区间语法,start..=end。
let range = 1..=10; // 闭区间,包含 1 到 10
let v: Vec<i32> = range.collect(); // 转换为 Vec<i32>
println!("{:?}", v); // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
解释:
1..=10创建了一个从1到10的闭区间,包括10。- 这种方式适用于需要包含结束值的场景。
3. 反向区间:rev()
Rust 的 Range 也支持反向迭代,通过 .rev() 方法,可以将范围反转过来。
let range = (1..=10).rev(); // 从 10 到 1
let v: Vec<i32> = range.collect(); // 转换为 Vec<i32>
println!("{:?}", v); // 输出:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
解释:
- 使用
rev()后,范围的顺序会被反转,从10到1。 - 这对于需要反向迭代的场景非常有用,比如倒序处理数据。
4. 步长区间:step_by()
有时并不想要每个连续的值,而是希望跳过某些值。Rust 提供了 .step_by(n) 方法,允许设置一个步长。
let range = (1..=10).step_by(2); // 每次跳过 1,包含 1, 3, 5, 7, 9
let v: Vec<i32> = range.collect();
println!("{:?}", v); // 输出:[1, 3, 5, 7, 9]
解释:
step_by(2)表示每隔两个数取一个值。因此,输出将是1, 3, 5, 7, 9。
这种功能非常适合需要步长迭代的场景,例如筛选特定间隔的数据。
5. 范围与迭代器方法:map()、filter() 等
Rust 的范围不仅是简单的数值区间,它也是一个 迭代器。因此,可以对其进行更多操作,例如 map()、filter() 和 for_each() 等。
let range = 1..=5;
let sum: i32 = range.map(|x| x * 2).sum(); // 每个元素乘以 2 并求和
println!("{}", sum); // 输出 30 (2 + 4 + 6 + 8 + 10)
解释:
- 这里我们使用
.map(|x| x * 2)将范围中的每个数字乘以 2,然后使用.sum()求和。 - 这种方式能够帮助你灵活地处理范围中的每个元素。
6. into_iter() 与 collect()
除了使用范围生成数组或向量,还可以直接使用 into_iter() 和 .collect() 方法。
let range = 1..=5;
let v: Vec<i32> = range.into_iter().collect();
println!("{:?}", v); // 输出:[1, 2, 3, 4, 5]
解释:
into_iter()方法会消耗原来的范围,并将其转换为一个迭代器。- 使用
collect()方法,将迭代器转换为一个Vec<i32>。
这种方式简化了范围与集合之间的转换。
7. 范围与切片操作
Rust 还允许你将范围用于切片操作,这对于数组和向量操作非常有用。
let arr = [10, 20, 30, 40, 50];
let slice = &arr[1..4]; // 包括索引 1 到 3 的元素
println!("{:?}", slice); // 输出 [20, 30, 40]
解释:
1..4是一个半开区间,表示从索引1到3的元素(不包括索引4)。- 这种方式非常适用于在数组或向量中提取部分元素。
8. 注意事项
8.1 范围的类型
Rust 中的范围有两种主要类型:
- Exclusive Range (
..):不包括右边界。 - Inclusive Range (
..=):包括右边界。
例如:
let exclusive = 1..5; // 1, 2, 3, 4
let inclusive = 1..=5; // 1, 2, 3, 4, 5
8.2 范围的边界行为
Rust 中的范围具有明确的行为:
start..end不包括end。start..=end包括end。- 负数可以作为范围的起始或结束值,适用于切片和数组。
例如:
let arr = [10, 20, 30, 40, 50];
let slice = &arr[1..=-1]; // 从索引1到倒数第一个元素
println!("{:?}", slice); // 输出 [20, 30, 40]
总结
Rust 中的范围是一个功能强大且灵活的工具,广泛应用于迭代、切片、步长控制等场景。通过理解其基本用法及进阶特性,开发者能够高效地利用范围来处理序列和集合操作。无论是简单的 for 循环,还是复杂的步长与反向迭代,Rust 的范围都能为你的代码提供简洁而强大的支持。

浙公网安备 33010602011771号