ZetCode

Rust 控制流

最后修改于 2025 年 2 月 19 日

在本文中,我们将展示如何控制 Rust 程序的流程。

Rust 程序代码从上到下执行。可以使用各种关键字来改变程序的流程,包括 if/elseloopforwhilematch

控制流结构用于有条件地或多次执行代码。

[dependencies]
rand = "0.8.5"

要生成随机值,我们需要 rand 包。

if 条件

if 关键字用于创建简单的条件测试。它可以与 else ifelse 关键字结合使用。

main.rs
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let n = rng.gen_range(-5..5);

    if n < 0 {
        println!("negative value");
    } else if n == 0 {
        println!("zero");
    } else {
        println!("positive value");
    }
}

我们从 -5..5 的范围内随机选择一个值。根据结果值,我们打印一条消息。有三种可能的执行分支。

if n < 0 {
    println!("negative value");
...

如果 if 关键字后面的表达式为 true,则执行下一条语句。其他分支不执行。

} else if n == 0 {
    println!("zero");
...

如果前一个分支不为 true,我们尝试下一个分支;即 else if。如果为 true,则执行其代码块,测试结束。否则,继续下一个分支。

} else {
    println!("positive value");
}

当前面的分支都不满足时,else 分支始终被执行。

λ cargo run -q
negative value
λ cargo run -q
positive value
λ cargo run -q
zero
λ cargo run -q
positive value

if 条件是表达式;它们可以返回值。

main.rs
use rand::Rng;

fn main() {

    let mut rng = rand::thread_rng();

    let n = rng.gen_range(-5..5);

    let msg = if n < 0 {
        "negative value"
    } else if n == 0 {
        "zero"
    } else {
        "positive value"
    };

    println!("{}", msg);
}

在此示例中,if 表达式返回一个结果,该结果随后被打印。

循环

使用 loop 关键字创建无限循环。使用 break 关键字终止循环。

main.rs
fn main() {
    let mut i = 0;

    loop {
        println!("falcon");

        i += 1;
        if i == 5 {
            break;
        }
    }
}

在示例中,我们打印一个单词五次。

let mut i = 0;

我们定义一个计数器;i 通常用作计数器变量。

loop {
    println!("falcon");

    i += 1;
    if i == 5 {
        break;
    }
}

使用 loop,我们开始执行给定的代码块,直到我们中断循环。

if i == 5 {
    break;
}

如果满足条件,则使用 break 终止循环。

λ cargo run -q
falcon
falcon
falcon
falcon
falcon

while 循环

while 关键字用于创建循环。它一直运行直到满足给定条件。

main.rs
fn main() {
    let mut x = 1;

    while x <= 10 {
        println!("{}", x);
        x += 1;
    }

    println!("x: {}", x);
}

在程序中,我们打印数字 1 到 10。最后,我们打印用作计数器的 x

while x <= 10 {
    println!("{}", x);
    x += 1;
}

while 循环在条件为 true 时执行;即 x 小于 10。

λ cargo run -q
1
2
3
4
5
6
7
8
9
10
x: 11

在下一个示例中,我们使用 while 循环来计算整数的和。

main.rs
use std::vec;

fn main() {
    let vals = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let mut i = 0;
    let mut sum = 0;
    let n = vals.len();

    while i < n {
        sum += vals[i];
        i += 1;
    }

    println!("The sum is: {}", sum);
}

我们有一个整数向量。使用 while 循环,我们计算元素的和。

let mut i = 0;
let mut sum = 0;
let n = vals.len();

为了计算总和,我们需要一个索引变量、总和变量和向量的长度。

while i < n {
    sum += vals[i];
    i += 1;
}

在 while 循环中,我们将元素添加到 sum 变量中。

λ cargo run -q
The sum is: 55

for 循环

使用 for 关键字,我们遍历一系列值或值的集合。

main.rs
fn main() {
    for i in 1..=10 {
        print!("{} ", i);
    }

    println!();

    let vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    for e in vals {
        print!("{} ", e);
    }

    println!();
}

在程序中,我们遍历整数范围和整数数组。

for i in 1..=10 {
    print!("{} ", i);
}

我们遍历范围内的整数;在每个周期中,i 变量保存当前值。我们在代码块中打印该值。

let vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for e in vals {
    print!("{} ", e);
}

我们有一个整数数组;我们逐个遍历数组并将其值打印到终端。

λ cargo run -q
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 

Match 表达式

模式匹配是一种强大的控制流结构,它允许我们将一个值与一系列模式进行比较,然后根据哪个模式匹配来执行代码。

在 match 表达式中,每个被执行的选项称为一个 arm。

main.rs
fn main() {
    let grades = ["A", "B", "C", "D", "E", "F", "FX"];

    for grade in grades {
        match grade {
            "A" | "B" | "C" | "D" | "E" | "F" => println!("passed"),
            "FX" => println!("failed"),
            _ => println!("unknown")
        }
    }
}

我们有一个成绩数组。我们遍历数组并为每个值打印“通过”或“失败”。此示例使用了多选项 arm,这节省了很多空间。它比使用多个 if/else 关键字要短得多。

$ cargo run -q
passed
passed
passed
passed
passed
passed
failed

在本文中,我们研究了 Rust 中的控制流结构。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Rust 教程