Rust 提供了强大而灵活的循环控制结构,主要包括 loop
、while
和 for
三种循环方式。
1. loop 循环
loop
是 Rust 中最简单的循环结构,它会无限循环 执行代码块,直到遇到 break
语句。
基本用法
rust
let mut count = 0;
loop {
println!("Count: {}", count);
count += 1;
if count == 5 {
break; // 退出循环
}
}
返回值
loop
循环可以返回值,通过 break
表达式后跟值来实现:
rust
let mut count = 0;
let result = loop {
count += 1;
if count == 10 {
break count * 2; // 循环返回值为 20 }
};
println!("The result is: {}", result); // 输出: The result is: 20
2. while 循环
while
循环在条件为真时重复执行代码块,每次迭代前都会检查条件。
基本用法
rust
let mut count = 3;
while count > 0 {
println!("T-minus {}...", count);
count -= 1;
}
println!("Liftoff!");
while let 循环
while let
是 Rust 中的一种模式匹配循环,常用于处理枚举或 Option
类型:
rust
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
while let Some(top) = stack.pop() {
println!("栈顶元素: {}", top);
}
3. for 循环
for
循环用于遍历集合,是 Rust 中最常用且最安全的迭代方式。
遍历集合
rust
let numbers = [10, 20, 30, 40, 50];
// 方法1: 使用 iter()
for number in numbers.iter() {
println!("Number: {}", number);
}
// 方法2: 直接遍历(数组会自动转换为迭代器)
for number in numbers {
println!("Number: {}", number);
}
使用 enumerate() 获取索引
rust
let numbers = [10, 20, 30, 40, 50];
for (index, number) in numbers.iter().enumerate() {
println!("Index: {}, Number: {}", index, number);
}
使用 Range
Rust 的标准库提供了 Range
,可用于生成数字序列:
rust
// 正向范围 (1..4): 1, 2, 3for i in 1..4 {
println!("向上计数: {}", i);
}
// 反向范围
for countdown in (1..=3).rev() { // (1..=3): 1, 2, 3
println!("倒计时: {}", countdown);
}
4. 循环控制语句
Rust 提供了 break
和 continue
来控制循环流程。
break 语句
break
用于立即退出循环:
rust
let mut number = 0;
loop {
if number > 3 {
break; // 当 number > 3 时退出循环
}
number += 1;
}
continue 语句
continue
用于跳过当前迭代,继续下一次迭代:
rust
for number in 1..=5 {
if number % 2 == 0 {
continue; // 跳过偶数
}
println!("奇数: {}", number);
}
5. 循环标签
Rust 允许为循环指定标签 ,这在嵌套循环中特别有用,可以精确控制哪个循环被 break
或 continue
影响。
rust
'outer: for x in 0..3 {
'inner: for y in 0..3 {
if x == 1 && y == 1 {
break 'outer; // 直接退出外层循环
}
if y == 0 {
continue 'inner; // 继续内层循环的下一次迭代
}
println!("x: {}, y: {}", x, y);
}
}
6. 使用建议与最佳实践
-
优先选择 for 循环 :当需要遍历集合时,
for
循环因其安全性和简洁性而成为首选,它避免了索引越界的风险。for
循环默认使用into_iter()
,这会移动 (take ownership)集合的所有权。如果只想读取 数据,使用.iter()
;如果需要修改 数据,使用.iter_mut()
。 -
loop 适用于无限循环或需显式退出的场景 :当需要无限循环或循环退出条件比较复杂时,
loop
更合适。使用无限循环时虽然while true
和loop
运行时行为相同,但 loop
关键字为编译器提供了更强的确定性,能进行更准确的流程分析,避免不必要的警告。 -
while 适用于条件控制循环 :当循环次数由条件决定,且条件可能在循环过程中改变时,使用
while
循环。 -
利用循环返回值 :
loop
可以通过break
返回值,这在需要从循环中获取结果时非常有用。 -
使用标签管理复杂嵌套循环:对于多层嵌套循环,使用标签可以更清晰地控制流程。
-
优先使用迭代器适配器 :对于集合操作,优先考虑使用
map
、filter
、fold
、sum
等迭代器方法,而非手动编写循环。这不仅是 Rust 的惯用法,通常性能也更优。 -
利用
enumerate
获取索引 :需要在循环中同时使用索引和值时,使用enumerate()
方法,而不是退回到手动索引的方式。