Rust - 决策
Rust - 决策控制
Section titled “Rust - 决策控制”决策控制结构允许程序根据特定条件执行不同的代码块。Rust 提供了强大而安全的工具来控制程序的流程。主要的构造是 if/else 表达式和 match 语句。
以下是 Rust 控制流语句的概述:
| 语句 | 描述 |
|---|---|
if 表达式 | 如果条件为真,则执行代码。 |
if-else 表达式 | 如果条件为真,则执行一个代码块;如果条件为假,则执行另一个代码块。 |
if-else if-else | 允许按顺序检查多个条件。 |
match 语句 | 一个强大的控制流运算符,它将值与一系列模式进行比较,并根据哪个模式匹配来执行代码。 |
if-else 是表达式
Section titled “if-else 是表达式”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 语句
Section titled “match 语句”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 模式
Section titled “高级 match 模式”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"), }}使用 if let 的简洁控制流
Section titled “使用 if let 的简洁控制流”有时,你的 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"); }}