《Rust编程入门》5.2 循环(loop、while和for)
5.2 循环(loop、while 和 for)
循环是程序控制流程的核心工具之一,用于反复执行一段代码直到满足某些条件。Rust 提供了三种主要的循环结构:loop、while 和 for。每种循环在不同场景下都有独特的优势。
5.2.1 无条件循环:loop
loop 是 Rust 中的无限循环,通常用于需要不断运行的场景,比如服务器监听。可以使用 break 关键字退出循环。
基本用法
fn main() {
let mut count = 0;
loop {
count += 1;
println!("Count: {}", count);
if count == 5 {
break; // 退出循环
}
}
}
带返回值的 loop
loop 可以通过 break 返回一个值,这在某些情况下非常有用。
fn main() {
let result = loop {
let x = 10;
if x > 5 {
break x * 2; // 返回 20
}
};
println!("Result: {}", result);
}
5.2.2 条件循环:while
while 循环在每次迭代前检查条件,当条件为 false 时退出循环。
基本用法
fn main() {
let mut number = 3;
while number > 0 {
println!("Number: {}", number);
number -= 1;
}
println!("Liftoff!");
}
常见错误:条件永远为真
注意避免创建条件永远为真的 while 循环,这可能导致程序无限执行。
5.2.3 遍历集合:for
for 循环是 Rust 中最常用的循环结构,用于遍历集合或范围。for 循环的语法简单、安全,不容易出错。
遍历范围
for 循环可以通过 .. 或 ..= 操作符生成数值范围。
start..end:左闭右开区间,包含start不包含end。start..=end:左闭右闭区间,包含start和end。
fn main() {
for i in 1..5 {
println!("Number: {}", i);
}
for i in 1..=5 {
println!("Inclusive Number: {}", i);
}
}
遍历集合
Rust 提供了强大的迭代器,可以用 for 遍历集合类型,如数组和向量。
fn main() {
let numbers = [10, 20, 30, 40];
for number in numbers.iter() {
println!("Number: {}", number);
}
}
使用 enumerate
enumerate 方法可以同时获取索引和值。
fn main() {
let numbers = vec!["one", "two", "three"];
for (index, value) in numbers.iter().enumerate() {
println!("Index: {}, Value: {}", index, value);
}
}
5.2.4 控制循环的执行
1. 跳过本次循环:continue
continue 关键字会跳过当前循环的剩余部分,直接进入下一次迭代。
fn main() {
for i in 1..=5 {
if i % 2 == 0 {
continue; // 跳过偶数
}
println!("Odd Number: {}", i);
}
}
2. 退出循环:break
break 关键字立即终止循环。
3. 标记循环:标签
在嵌套循环中,可以使用标签指定要控制的循环。
fn main() {
'outer: for i in 1..=3 {
for j in 1..=3 {
if i == 2 && j == 2 {
break 'outer; // 退出外层循环
}
println!("i: {}, j: {}", i, j);
}
}
}
5.2.5 比较三种循环
| 特性 | loop |
while |
for |
|---|---|---|---|
| 使用场景 | 无限循环,直到明确退出 | 条件控制循环 | 遍历集合或范围 |
| 退出方式 | break |
条件为假 | 自动退出,无需显式控制 |
| 是否简洁 | 灵活,但代码可能较冗长 | 条件明确,代码简洁 | 简单高效,特别适合集合或范围遍历 |
5.2.6 小结
Rust 提供了灵活的循环结构:
- 使用
loop实现无限循环,并通过break控制退出。 - 使用
while在满足条件时循环执行代码。 - 使用
for遍历范围或集合,是 Rust 编程中最安全、最推荐的循环方式。
在下一节中,我们将介绍 Rust 的模式匹配功能,通过 match 和 if let 提供更强大的流程控制能力。