Rust 常用语法速记 - 循环

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

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 提供了 breakcontinue来控制循环流程。

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 允许为循环指定标签 ,这在嵌套循环中特别有用,可以精确控制哪个循环被 breakcontinue影响。

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

  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()方法,而不是退回到手动索引的方式。

相关推荐
木木一直在哭泣1 分钟前
Spring 里的过滤器(Filter)和拦截器(Interceptor)到底啥区别?
后端
源码获取_wx:Fegn08958 分钟前
基于springboot + vue物业管理系统
java·开发语言·vue.js·spring boot·后端·spring·课程设计
無量9 分钟前
MySQL事务与锁机制深度剖析
后端·mysql
無量9 分钟前
MySQL索引设计与优化实战
后端·mysql
木木一直在哭泣16 分钟前
CAS 一篇讲清:原理、Java 用法,以及线上可用的订单状态机幂等方案
后端
王中阳Go17 分钟前
我辅导400+学员拿Go Offer后发现:突破年薪50W,常离不开这10个实战技巧
后端·面试·go
Tortoise24 分钟前
OpenTortoise:开箱即用的Java调用LLM中间件,一站式解决配置、调用、成本监控和智能记忆
后端
摸鱼仙人~2 小时前
Flask-SocketIO 连接超时问题排查与解决(WSL / 虚拟机场景)
后端·python·flask
Lisonseekpan2 小时前
@Autowired 与 @Resource区别解析
java·开发语言·后端
chenyuhao20242 小时前
Linux系统编程:线程概念与控制
linux·服务器·开发语言·c++·后端