Rust 常用语法速记 - 循环

169 阅读3分钟

Rust 提供了强大而灵活的循环控制结构,主要包括 loopwhilefor三种循环方式。

1. loop 循环

loop是 Rust 中最简单的循环结构,它会无限循环执行代码块,直到遇到 break语句。

基本用法

let mut count = 0;

loop {
    println!("Count: {}", count);
    count += 1;
    
    if count == 5 {
        break; // 退出循环
    }
}

返回值

loop循环可以返回值,通过 break表达式后跟值来实现:

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循环在条件为真时重复执行代码块,每次迭代前都会检查条件。

基本用法

let mut count = 3;  
  
while count > 0 {  
    println!("T-minus {}...", count);  
    count -= 1;  
}  
  
println!("Liftoff!");

while let 循环

while let是 Rust 中的一种模式匹配循环,常用于处理枚举或 Option类型:

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 中最常用且最安全的迭代方式。

遍历集合

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() 获取索引

let numbers = [10, 20, 30, 40, 50];  
  
for (index, number) in numbers.iter().enumerate() {  
    println!("Index: {}, Number: {}", index, number);  
}

使用 Range

Rust 的标准库提供了 Range,可用于生成数字序列:

// 正向范围 (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 提供了 breakcontinue来控制循环流程。

break 语句

break用于立即退出循环​:

let mut number = 0;

loop {
    if number > 3 {
        break; // 当 number > 3 时退出循环
    }
    number += 1;
}

continue 语句

continue用于跳过当前迭代,继续下一次迭代:

for number in 1..=5 {  
    if number % 2 == 0 {  
        continue; // 跳过偶数  
    }  
    println!("奇数: {}", number);  
}

5. 循环标签

Rust 允许为循环指定标签,这在嵌套循环中特别有用,可以精确控制哪个循环被 breakcontinue影响。

'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. 使用建议与最佳实践

  1. 优先选择 for 循环​:当需要遍历集合时,for循环因其安全性和简洁性而成为首选,它避免了索引越界的风险。for循环默认使用 into_iter(),这会移动​(take ownership)集合的所有权。如果只想读取数据,使用 .iter();如果需要修改数据,使用 .iter_mut()

  2. loop 适用于无限循环或需显式退出的场景​:当需要无限循环或循环退出条件比较复杂时,loop更合适。使用无限循环时虽然 while trueloop运行时行为相同,但 ​loop关键字为编译器提供了更强的确定性,能进行更准确的流程分析,避免不必要的警告。

  3. while 适用于条件控制循环​:当循环次数由条件决定,且条件可能在循环过程中改变时,使用 while循环。

  4. 利用循环返回值​:loop可以通过 break返回值,这在需要从循环中获取结果时非常有用。

  5. 使用标签管理复杂嵌套循环​:对于多层嵌套循环,使用标签可以更清晰地控制流程。

  6. 优先使用迭代器适配器​:对于集合操作,优先考虑使用 mapfilterfoldsum等迭代器方法,而非手动编写循环。这不仅是 Rust 的惯用法,通常性能也更优。

  7. 利用 enumerate获取索引​:需要在循环中同时使用索引和值时,使用 enumerate()方法,而不是退回到手动索引的方式。