rust学习-循环

rust学习-循环

  • [1. loop 循环](#1. loop 循环)
    • [从 loop 返回值](#从 loop 返回值)
  • [2. while 循环](#2. while 循环)
    • [while let 模式](#while let 模式)
  • [3. for 循环](#3. for 循环)
  • [4. 循环控制语句](#4. 循环控制语句)
    • break
    • continue
    • [break 和 continue 在嵌套循环中](#break 和 continue 在嵌套循环中)
  • [5. 循环标签](#5. 循环标签)
  • [6. 迭代器与循环](#6. 迭代器与循环)
  • [7. 性能考虑](#7. 性能考虑)
    • [迭代器 vs 索引访问](#迭代器 vs 索引访问)
    • 循环展开
  • [8. 常见模式与最佳实践](#8. 常见模式与最佳实践)
    • [模式1: 搜索模式](#模式1: 搜索模式)
    • [模式2: 累积模式](#模式2: 累积模式)
    • [模式3: 转换模式](#模式3: 转换模式)
    • [模式4: 窗口迭代](#模式4: 窗口迭代)

1. loop 循环

loop 是 Rust 中最简单的循环,它会无限循环直到显式中断。

基本语法

rust 复制代码
loop {
    // 代码块
}

示例

rust 复制代码
fn main() {
    let mut count = 0;
    
    loop {
        count += 1;
        println!("计数: {}", count);
        
        if count >= 5 {
            break; // 退出循环
        }
    }
}

从 loop 返回值

rust 复制代码
fn main() {
    let mut counter = 0;
    
    let result = loop {
        counter += 1;
        
        if counter == 10 {
            break counter * 2; // 从循环返回值
        }
    };
    
    println!("结果为: {}", result); // 输出: 20
}

2. while 循环

while 循环在条件为真时重复执行代码块。

基本语法

rust 复制代码
while condition {
    // 代码块
}

示例

rust 复制代码
fn main() {
    let mut number = 3;
    
    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }
    
    println!("发射!");
}

while let 模式

rust 复制代码
fn main() {
    let mut stack = Vec::new();
    
    stack.push(1);
    stack.push(2);
    stack.push(3);
    
    // 当弹出操作返回 Some(value) 时继续循环
    while let Some(top) = stack.pop() {
        println!("{}", top);
    }
}

3. for 循环

for 循环主要用于遍历集合或范围。

基本语法

rust 复制代码
for item in collection {
    // 代码块
}

遍历范围

rust 复制代码
fn main() {
    // 范围 1..5 包含 1, 2, 3, 4
    for i in 1..5 {
        println!("i = {}", i);
    }
    
    // 范围 1..=5 包含 1, 2, 3, 4, 5
    for i in 1..=5 {
        println!("i = {}", i);
    }
    
    // 递减范围
    for i in (1..5).rev() {
        println!("i = {}", i);
    }
}

遍历数组/向量

rust 复制代码
fn main() {
    let arr = [10, 20, 30, 40, 50];
    
    // 直接遍历元素
    for element in arr {
        println!("值为: {}", element);
    }
    
    // 遍历索引和值
    for (index, value) in arr.iter().enumerate() {
        println!("索引 {} 的值为 {}", index, value);
    }
    
    // 遍历向量
    let vec = vec!["Rust", "Python", "Lua", "Go"];
    for language in vec {
        println!("编程语言: {}", language);
    }
}

遍历字符串

rust 复制代码
fn main() {
    let s = "Hello, Rust!";
    
    // 遍历字符
    for c in s.chars() {
        println!("字符: {}", c);
    }
    
    // 遍历字节
    for b in s.bytes() {
        println!("字节: {}", b);
    }
}

4. 循环控制语句

break

rust 复制代码
fn main() {
    for i in 0..10 {
        if i == 5 {
            break; // 当 i == 5 时退出循环
        }
        println!("i = {}", i);
    }
}

continue

rust 复制代码
fn main() {
    for i in 0..10 {
        if i % 2 == 0 {
            continue; // 跳过偶数
        }
        println!("奇数: {}", i);
    }
}

break 和 continue 在嵌套循环中

rust 复制代码
fn main() {
    let mut count = 0;
    
    'outer: for x in 0..5 {
        for y in 0..5 {
            count += 1;
            
            if y == 2 {
                continue; // 跳过当前内层循环的剩余部分
            }
            
            if x == 3 && y == 3 {
                break 'outer; // 跳出外层循环
            }
            
            println!("({}, {})", x, y);
        }
    }
    
    println!("总循环次数: {}", count);
}

5. 循环标签

Rust 可为循环添加标签,以便在嵌套循环中精确控制 break 和 continue。

示例

rust 复制代码
fn main() {
    let mut matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
    let target = 5;
    
    'outer: for (i, row) in matrix.iter().enumerate() {
        'inner: for (j, &item) in row.iter().enumerate() {
            if item == target {
                println!("找到 {} 在位置 ({}, {})", target, i, j);
                break 'outer; // 跳出外层循环
            }
        }
    }
}

6. 迭代器与循环

常用迭代器方法

rust 复制代码
fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    
    // map: 转换每个元素
    for n in numbers.iter().map(|x| x * 2) {
        println!("加倍: {}", n);
    }
    
    // filter: 过滤元素
    for n in numbers.iter().filter(|&&x| x % 2 == 0) {
        println!("偶数: {}", n);
    }
    
    // zip: 合并两个迭代器
    let names = vec!["aaa", "bbb", "ccc"];
    for (name, &number) in names.iter().zip(numbers.iter()) {
        println!("{}: {}", name, number);
    }
    
    // chain: 连接迭代器
    let more_numbers = vec![6, 7, 8];
    for n in numbers.iter().chain(more_numbers.iter()) {
        println!("连接后: {}", n);
    }
}

迭代器适配器

rust 复制代码
fn main() {
    let numbers = 1..=10;
    
    // 链式调用迭代器方法
    let result: Vec<i32> = numbers
        .filter(|&x| x % 2 == 0)    // 保留偶数
        .map(|x| x * x)             // 平方
        .take(3)                    // 取前3个
        .collect();                 // 收集到向量中
    
    println!("结果: {:?}", result); // [4, 16, 36]
}

7. 性能考虑

迭代器 vs 索引访问

rust 复制代码
fn main() {
    let vec = vec![1, 2, 3, 4, 5];
    
    // 方式1: 使用索引 (可能越界)
    for i in 0..vec.len() {
        println!("元素[{}] = {}", i, vec[i]);
    }
    
    // 方式2: 使用迭代器 (更安全)
    for (i, value) in vec.iter().enumerate() {
        println!("元素[{}] = {}", i, value);
    }
    
    // 方式3: 使用 get 方法 (安全,需要处理 Option)
    for i in 0..vec.len() {
        if let Some(value) = vec.get(i) {
            println!("元素[{}] = {}", i, value);
        }
    }
}

循环展开

rust 复制代码
fn sum_array(arr: &[i32]) -> i32 {
    let mut sum = 0;
    
    // 手动循环展开可以提高性能
    let chunks = arr.chunks_exact(4);
    let remainder = chunks.remainder();
    
    for chunk in chunks {
        // 每次处理4个元素
        sum += chunk[0] + chunk[1] + chunk[2] + chunk[3];
    }
    
    // 处理剩余元素
    for &value in remainder {
        sum += value;
    }
    
    sum
}

fn main() {
    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    println!("总和: {}", sum_array(&arr));
}

8. 常见模式与最佳实践

模式1: 搜索模式

rust 复制代码
fn find_first_even(numbers: &[i32]) -> Option<&i32> {
    for number in numbers {
        if number % 2 == 0 {
            return Some(number);
        }
    }
    None
}

fn main() {
    let numbers = [1, 3, 5, 7, 8, 9];
    if let Some(even) = find_first_even(&numbers) {
        println!("找到第一个偶数: {}", even);
    }
}

模式2: 累积模式

rust 复制代码
fn calculate_product(numbers: &[i32]) -> i32 {
    let mut product = 1;
    for &number in numbers {
        product *= number;
    }
    product
}

fn main() {
    let numbers = [1, 2, 3, 4, 5];
    println!("乘积: {}", calculate_product(&numbers));
}

模式3: 转换模式

rust 复制代码
fn to_uppercase_strings(strings: &[&str]) -> Vec<String> {
    let mut result = Vec::new();
    for s in strings {
        result.push(s.to_uppercase());
    }
    result
}

// 使用迭代器更简洁的写法
fn to_uppercase_strings_iter(strings: &[&str]) -> Vec<String> {
    strings.iter().map(|s| s.to_uppercase()).collect()
}

fn main() {
    let strings = ["hello", "world", "rust"];
    println!("{:?}", to_uppercase_strings(&strings));
}

模式4: 窗口迭代

rust 复制代码
fn sliding_window_average(data: &[f64], window_size: usize) -> Vec<f64> {
    let mut averages = Vec::new();
    
    for window in data.windows(window_size) {
        let sum: f64 = window.iter().sum();
        averages.push(sum / window_size as f64);
    }
    
    averages
}

fn main() {
    let data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
    let averages = sliding_window_average(&data, 3);
    println!("滑动窗口平均值: {:?}", averages);
}
相关推荐
阿豪只会阿巴1 天前
【多喝热水系列】从零开始的ROS2之旅——Day5
c++·笔记·python·ubuntu·ros2
Haooog1 天前
LangChain4j 学习
java·学习·大模型·langchain4j
维C泡泡1 天前
STL(初识string)
开发语言·c++
爬山算法1 天前
Hibernate(25)Hibernate的批量操作是什么?
java·后端·hibernate
郝学胜-神的一滴1 天前
Linux线程使用注意事项:骈文技术指南
linux·服务器·开发语言·数据结构·c++·程序人生
叫我:松哥1 天前
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,集成 ECharts 进行数据可视化,采用混合推荐算法
开发语言·python·信息可视化·flask·echarts·pandas·推荐算法
WarPigs1 天前
数据库笔记
数据库·笔记
此剑之势丶愈斩愈烈1 天前
mybatis-plus乐观锁
开发语言·python·mybatis
CC.GG1 天前
【Qt】常用控件----容器类控件(QGroupBox、QTabWidget )以及布局管理器
开发语言·qt