Skip to content

Rust - 决策

决策控制结构允许程序根据特定条件执行不同的代码块。Rust 提供了强大而安全的工具来控制程序的流程。主要的构造是 if/else 表达式和 match 语句。

以下是 Rust 控制流语句的概述:

语句描述
if 表达式如果条件为真,则执行代码。
if-else 表达式如果条件为真,则执行一个代码块;如果条件为假,则执行另一个代码块。
if-else if-else允许按顺序检查多个条件。
match 语句一个强大的控制流运算符,它将值与一系列模式进行比较,并根据哪个模式匹配来执行代码。

Rust 中的一个关键特性是 if 是一个表达式,而不仅仅是一个语句。这意味着它会求值产生一个值,你可以将这个值赋给一个变量。这使得代码非常简洁和可读。

fn main() {
let number = 6;
// 传统的 if-else 语句
if number % 4 == 0 {
println!("Number is divisible by 4");
} else if number % 3 == 0 {
println!("Number is divisible by 3");
} else {
println!("Number is not divisible by 4 or 3");
}
// 将 `if` 用作表达式
let is_even = if number % 2 == 0 {
true // 这是条件为真时返回的值
} else {
false // 这是条件为假时返回的值
};
println!("Is the number even? {}", is_even);
// 这甚至更简洁
let description = if is_even { "even" } else { "odd" };
println!("The number is {}.", description);
}

重要提示:当将 if 用作表达式时,每个代码块返回的值必须是相同的类型。编译器会强制执行此规则以确保类型安全。

match 语句是 Rust 最受欢迎的特性之一。它允许你将一个值与一系列模式进行比较,并根据第一个匹配的模式执行代码。你可以将其视为一个功能强大的 switch 语句。

match 的一个关键特性是穷尽性检查。编译器会确保你处理了每一种可能的情况,这可以防止因遗漏条件而导致的错误。_ 占位符是一个兜底模式,它匹配所有尚未处理的值。

fn main() {
let country_code = "US";
let country = match country_code {
"US" => "United States",
"CA" => "Canada",
"MX" => "Mexico",
"GB" | "UK" => "United Kingdom", // 匹配多个模式
_ => "Unknown", // 默认情况
};
println!("The country is: {}", country);
}

match 不仅仅能比较简单值。它还可以解构枚举、元组和结构体,甚至可以使用守卫。

fn main() {
let some_number = Some(5);
let no_number: Option<i32> = None;
let x = 10;
match some_number {
Some(50) => println!("Got 50"),
// 你可以添加一个条件,称为 match 守卫
Some(n) if n == x => println!("Matched a number equal to x"),
// 此模式将内部值绑定到 `n`
Some(n) => println!("Matched some other number: {}", n),
// 这处理了 None 情况
None => println!("Matched None"),
}
// 匹配范围(包含)
let age = 30;
match age {
0 => println!("Newborn"),
1..=12 => println!("Child"),
13..=19 => println!("Teenager"),
_ => println!("Adult"),
}
}

有时,你的 match 表达式只关心其中一种情况,并希望忽略所有其他情况。对于这种情况,Rust 提供了 if let,它是一种语法糖,等同于一个 match 表达式只对一种模式执行代码,而对所有其他模式不执行任何操作。

fn main() {
let favorite_color: Option<&str> = None;
let is_tuesday = false;
let age: Result<u8, _> = "34".parse();
// 在这里使用 `if let` 比完整的 `match` 更简洁。
if let Some(color) = favorite_color {
println!("Using your favorite color, {}, as the background", color);
} else if is_tuesday {
println!("Tuesday is green day!");
} else if let Ok(age) = age {
if age > 30 {
println!("Using purple as the background");
} else {
println!("Using orange as the background");
}
} else {
println!("Using blue as the background");
}
}