Rust 控制流
最后修改于 2025 年 2 月 19 日
在本文中,我们将展示如何控制 Rust 程序的流程。
Rust 程序代码从上到下执行。可以使用各种关键字来改变程序的流程,包括 if/else、loop、for、while 和 match。
控制流结构用于有条件地或多次执行代码。
[dependencies] rand = "0.8.5"
要生成随机值,我们需要 rand 包。
if 条件
if 关键字用于创建简单的条件测试。它可以与 else if 和 else 关键字结合使用。
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 条件是表达式;它们可以返回值。
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 关键字终止循环。
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 关键字用于创建循环。它一直运行直到满足给定条件。
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 循环来计算整数的和。
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 关键字,我们遍历一系列值或值的集合。
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。
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 中的控制流结构。
作者
列出 所有 Rust 教程。