Rust 循环(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程世界中,循环(Loop)如同“重复执行的指挥棒”,它让代码能够高效地处理重复性任务。无论是遍历数据集合、执行条件判断,还是构建复杂的算法逻辑,循环都是开发者不可或缺的工具。在 Rust 这门以安全性著称的语言中,循环的设计同样体现了其“零成本抽象”的核心思想——既保证内存安全,又提供灵活的控制能力。本文将从基础语法到高级技巧,结合实际案例,深入探讨 Rust 中的循环机制,并帮助读者掌握如何用它解决真实场景中的问题。


一、Rust 的基础循环结构

1.1 for 循环:遍历的“传送带”

for 循环是 Rust 中最直观的迭代工具,它通过模式匹配(Pattern Matching)直接操作集合(如数组、向量、字符串等)。其语法结构简洁,形如:

for item in collection {  
    // 执行逻辑  
}  

案例:遍历数组并打印元素

let numbers = [10, 20, 30, 40];  
for &num in numbers.iter() {  
    println!("当前数字:{}", num);  
}  

这里,numbers.iter() 返回一个迭代器(Iterator),而 &num 通过引用避免了值的所有权转移。这种设计既安全又高效。

1.2 while 循环:条件驱动的“交通灯”

while 循环在 Rust 中与大多数语言类似,它会在条件满足时重复执行代码块。其核心在于“先判断条件,后执行逻辑”。

let mut count = 0;  
while count < 5 {  
    println!("计数器:{}", count);  
    count += 1;  
}  

关键点:若条件永远为真,会导致无限循环(Infinite Loop),需谨慎设计退出条件。

1.3 loop 循环:永不停歇的“过山车”

loop 是 Rust 中最纯粹的无限循环结构,它没有条件判断,必须通过 break 显式终止。

loop {  
    println!("正在运行...");  
    if some_condition {  
        break; // 主动跳出循环  
    }  
}  

进阶用法loop 可以返回值,例如:

let result = loop {  
    let input = get_user_input();  
    if input == "exit" {  
        break "退出程序"; // 返回字符串  
    }  
};  
println!("最终结果:{}", result);  

二、循环控制与模式匹配

2.1 breakcontinue:循环的“刹车片”与“跳过键”

  • break:立即终止当前循环,可选返回值。
    'outer: for row in grid {  
        for cell in row {  
            if cell == 0 {  
                break 'outer; // 标签跳出外层循环  
            }  
        }  
    }  
    
  • continue:跳过当前迭代,进入下一轮循环。
    for number in 1..10 {  
        if number % 2 == 0 {  
            continue; // 跳过偶数  
        }  
        println!("奇数:{}", number);  
    }  
    

2.2 模式匹配与 if let:智能筛选的“过滤网”

在循环中结合模式匹配,可以更优雅地处理复杂数据。例如,遍历 Option<T> 类型时:

let numbers = vec![Some(1), None, Some(3)];  
for maybe_num in numbers {  
    if let Some(num) = maybe_num {  
        println!("有效值:{}", num);  
    } else {  
        println!("遇到空值");  
    }  
}  

对比传统方式:避免了冗余的 matchunwrap() 调用,代码更简洁安全。


三、高级循环技巧与迭代器

3.1 迭代器(Iterator):数据流的“传送管道”

Rust 的迭代器通过惰性求值(Lazy Evaluation)和链式调用,提供了高效且灵活的遍历方式。例如:

let numbers = vec![1, 2, 3, 4];  
let sum: i32 = numbers.iter()  
    .filter(|&x| x % 2 == 0) // 筛选偶数  
    .sum(); // 计算总和  
println!("偶数之和:{}", sum); // 输出 6  

核心优势

  • 内存友好:无需提前生成中间集合,仅在需要时计算。
  • 可组合性:通过 map, filter, take 等方法构建复杂逻辑链。

3.2 闭包(Closure):自定义行为的“工具箱”

在迭代器方法中,闭包允许开发者定义动态逻辑。例如,使用 map 转换数据类型:

let strings = vec!["1", "2", "3"];  
let integers: Vec<i32> = strings  
    .iter()  
    .map(|s| s.parse().unwrap()) // 转换为整数  
    .collect(); // 收集为向量  

注意:闭包需遵守借用规则,避免未预期的移动或悬垂引用。


四、性能优化与循环设计

4.1 避免重复计算:循环内的“轻量化”

在循环体内,应尽量将不变的计算移到循环外。例如:

let divisor = 5; // 移出循环外  
for number in 0..100 {  
    let result = number / divisor; // 避免重复计算  
    // ...  
}  

对比:若 divisor 在循环内重新计算,会显著增加时间复杂度。

4.2 并行循环:多核时代的“加速器”

通过 rayon 等 crate,Rust 可以轻松实现并行化循环,充分利用多核 CPU:

use rayon::prelude::*;  

let numbers = (0..1000).collect::<Vec<_>>();  
let sum: i32 = numbers.par_iter().sum();  

关键点:需权衡数据依赖关系,避免竞态条件(Race Condition)。


五、常见问题与最佳实践

5.1 无限循环的“安全出口”

当使用 loopwhile 时,务必确保存在退出条件。例如:

let mut input = String::new();  
loop {  
    input.clear();  
    io::stdin().read_line(&mut input).unwrap();  
    if input.trim() == "exit" {  
        break;  
    }  
    // ...  
}  

陷阱:忘记更新条件变量(如未修改计数器)会导致程序崩溃。

5.2 内存安全的“隐形卫士”

Rust 的编译器会强制检查循环中的所有权和生命周期。例如,若尝试在循环中重复借用同一变量:

let mut data = vec![1, 2, 3];  
for item in data.iter() { // 第一次借用  
    // ...  
}  
for item in data.iter() { // 第二次借用:合法,因为是不可变借用  
    // ...  
}  

但若尝试可变借用两次,则会报错,避免了数据竞争。


结论

Rust 的循环机制不仅继承了传统语言的简洁性,更通过内存安全、迭代器链和闭包等特性,为开发者提供了更高效、更安全的控制流工具。从基础的 forwhile,到进阶的并行处理与模式匹配,掌握这些技能能显著提升代码的可维护性和执行效率。无论是处理小型脚本还是复杂系统,理解并善用 Rust 循环,将是迈向 Rust 高级开发的重要一步。

实践建议:尝试用 Rust 的迭代器重构现有代码,对比传统循环的性能差异,并探索 rayon 等 crate 在并行场景中的表现。循环的设计不仅是技术问题,更是对问题分解能力的考验——正如 Rust 的哲学所言:“安全是默认的,但自由同样存在。”

最新发布