Bootstrap

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

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


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

控制流(2)

1. While循环

1.1 基础

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

while condition {
    // 循环体:当condition为true时,重复执行的代码块
}

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

示例

fn main() {
    let mut number = 1;

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

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

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

for element in iterable {
    // 循环体:对iterable中的每个element执行的代码块
}
2.2 遍历数组
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 便利字符串的字符
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中也是可迭代的,你可以使用..来创建一个半开区间范围,或使用..=来创建一个闭区间范围。
;