Rust学习笔记_06——控制流(2)

Rust学习笔记_03------元组
Rust学习笔记_04------引用
Rust学习笔记_05------控制流(1)


Rust学习笔记_06------控制流(2)

控制流(2)

1. While循环

1.1 基础

Rust编程语言中,while循环是一种基本的控制流结构,它允许程序在给定条件为真时重复执行一段代码块。

rust 复制代码
while condition {
    // 循环体:当condition为true时,重复执行的代码块
}
  • condition是一个表达式,它必须返回一个实现了std::convert::Into<bool>的类型的值(通常直接就是一个布尔值bool)。在每次循环迭代之前,都会计算这个条件。
  • 如果条件为true,则执行大括号{}中的代码块。
  • 执行完代码块后,再次计算条件。
  • 如果条件仍为true,则重复执行代码块。
  • 这个过程会一直持续,直到条件变为false,此时循环结束,程序继续执行while循环之后的代码。

示例

rust 复制代码
fn main() {
    let mut number = 1;

    while number <= 5 {
        println!("{}", number);
        number += 1;
    }
}
1.2 break语句

break语句用于立即终止while循环,并跳出循环体,继续执行循环之后的代码。这对于在满足特定条件时提前退出循环非常有用。

rust 复制代码
fn main() {
    let mut number = 0;

    while true { // 无限循环,但我们会用break来退出它
        number += 1;
        println!("{}", number);

        if number >= 5 {
            break; // 当number达到5时,退出循环
        }
    }

    println!("Loop exited at number: {}", number);
}
1.3 continue语句
rust 复制代码
fn main() {
    let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    for number in &numbers { // 注意:这里为了演示,实际上用for循环更合适,但while循环也适用
        // 转换为while循环的示例(不推荐这样写,仅为了说明continue的用法)
        let mut index = 0;
        while index < numbers.len() {
            if *number % 2 == 0 { // 检查数字是否为偶数
                continue; // 如果是偶数,跳过当前迭代
            }
            println!("Odd number: {}", *number); // 只打印奇数
            index += 1; // 注意:在while循环中需要手动管理索引
            // 由于我们使用了for循环的变量number,这里实际上不需要index来遍历,
            // 但在将for转换为while时,为了模拟遍历,我们保留了index。
            // 在实际的while循环中,你应该根据需要来管理循环的状态。
            // 下面的代码是为了说明而保留的,实际上在这个例子中不需要。
            if index >= numbers.len() {
                break; // 退出循环(在这个例子中,由于我们使用了for的简化逻辑,这里不会被执行到)
            }
        }
        // 注意:上面的while循环逻辑是有问题的,因为它试图在每次for迭代中重新遍历整个vector。
        // 正确的做法是直接使用for循环或者用一个单独的while循环来遍历vector。
        // 下面的代码才是正确的while循环遍历vector的示例:
        let correct_numbers = vec![1, 2, 3, 4, 5]; // 另一个示例vector
        let mut correct_index = 0;
        while correct_index < correct_numbers.len() {
            let num = correct_numbers[correct_index];
            if num % 2 == 0 {
                correct_index += 1; // 直接跳到下一个迭代(虽然这里用continue也可以,但为了展示手动控制索引,我们没这么做)
                continue; // 在这个例子中,continue是多余的,因为下面就是增加索引的操作。
                // 但为了说明continue的用法,我们保留了它。
            }
            println!("Odd number in correct loop: {}", num);
            correct_index += 1;
        }
    }
    // 注意:上面的for循环部分是不正确的,仅用于说明continue的用法。
    // 正确的做法应该是直接使用一个while循环来遍历vector,如下所示:
    let numbers_again = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    let mut index_again = 0;
    while index_again < numbers_again.len() {
        let num = numbers_again[index_again];
        if num % 2 != 0 { // 打印奇数
            println!("Odd number in while loop: {}", num);
        }
        index_again += 1;
    }
}

2. for循环

2.1 基础

Rust编程语言中,for循环是一种用于迭代集合(如数组、切片、向量、字符串、哈希映射的键或值、范围等)的便捷控制流结构。它提供了一种简洁且易于理解的方式来遍历集合中的每个元素,并对每个元素执行一段代码。

rust 复制代码
for element in iterable {
    // 循环体:对iterable中的每个element执行的代码块
}
2.2 遍历数组
rust 复制代码
fn main() {
    // 如果你想要修改向量中的元素(注意:这需要可变引用)
    let mut mutable_numbers = vec![1, 2, 3, 4, 5];
    for number in &mut mutable_numbers {
        *number *= 2; // 将每个元素乘以2
    }
    println!("{:?}", mutable_numbers); // 输出: [2, 4, 6, 8, 10]
}
2.3 便利字符串的字符
rust 复制代码
fn main() {
    let greeting = "Hello, world!";

    for (index, char) in greeting.chars().enumerate() {
        println!("Character '{}' at index {}", char, index);
    }
}
2.4 注意事项
  • 在遍历不可变集合时,for循环中的element变量是不可变的。如果你需要修改集合中的元素,你需要获取一个可变引用(&mut),并在循环体内使用解引用(*)来修改元素的值。
  • Rust的for循环是通过迭代器实现的,这意味着你可以对任何实现了IntoIterator trait的类型使用for循环。
  • 在遍历哈希映射时,你可以分别遍历键、值或同时遍历键和值。这通常是通过调用keys()values()iter()方法来实现的。
  • 范围(Range)在Rust中也是可迭代的,你可以使用..来创建一个半开区间范围,或使用..=来创建一个闭区间范围。
相关推荐
神经美学_茂森15 分钟前
【通俗理解】步长和学习率在神经网络中是一回事吗?
人工智能·神经网络·学习
针不戳2022092618 分钟前
嵌入式硬件面试题【经验】总结----会不断添加更新
stm32·单片机·嵌入式硬件·学习·面试
IT古董38 分钟前
【机器学习】机器学习的基本分类-监督学习-逻辑回归(Logistic Regression)
学习·机器学习·分类
朝九晚五ฺ1 小时前
【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制
linux·运维·学习
岑梓铭1 小时前
考研408《计算机网络》复习笔记,第二章《网络数据交换形式3大类》
笔记·计算机网络·考研
Queen_sy2 小时前
react学习记录
javascript·学习·react.js
落霞的思绪2 小时前
mybatis笔记01——初始配置
java·笔记·mybatis
虾球xz2 小时前
游戏引擎学习第25天
javascript·学习·游戏引擎
英国翰思教育2 小时前
留学论文中描述性论文descriptive essay写作分析
大数据·论文阅读·人工智能·深度学习·学习·学习方法·论文笔记
●VON3 小时前
go语言的成神之路-筑基篇-第四章
开发语言·后端·学习·golang