跳转到主要内容
模块 2 · 第 2 课(共 2)课程中的4/14~15 min
模块课程(2/2)

模式匹配、选项和结果

Rust 有一个极其强大的控制流机制,称为“模式匹配”。它允许您将值与一系列模式进行比较,并根据模式匹配执行代码。

match 语句

Rust 中的 match 语句与其他语言中的 switch 类似,但更强大和安全。编译器确保匹配是详尽的,这意味着必须处理所有可能的情况:

Rust
enum Direction {
    North,
    South,
    East,
    West,
}

let dir = Direction::East;

match dir {
    Direction::North => println!("Andiamo a Nord"),
    Direction::South => println!("Andiamo a Sud"),
    Direction::East => println!("Andiamo a Est"),
    Direction::West => println!("Andiamo a Ovest"),
}

处理值缺失:Option

Rust 没有空值的概念(null 或 nil)。相反,标准库定义了一个名为 Option<T> 的枚举,它可以包含:

  • Some(T):包含 T 类型的值。
  • None:表示缺少值。
Rust
let x: Option<i32> = Some(5);
let y: Option<i32> = None;

match x {
    Some(val) => println!("C'e un valore: {}", val),
    None => println!("Nessun valore trovato"),
}

处理可恢复的错误:Result

对于可能失败的操作(例如读取文件或将字符串解析为数字),Rust 使用 Result<T, E> 枚举,它有两种变体:

  • Ok(T):操作成功并包含成功值T。
  • Err(E):操作失败并包含错误 E。
Rust
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
    if denominator == 0.0 {
        Err(String::from("Divisione per zero!"))
    } else {
        Ok(numerator / denominator)
    }
}

感谢 Rust 的编译器,您必须先处理 Err 情况,然后才能访问 Ok 内的值,从而防止许多常见的运行时错误。

通配符模式 _

当处理具有大量变体(如整数)的数据类型时,不可能在 match 中列出所有情况。 Rust 允许使用通配符 _ 来捕获所有未明确定义的剩余情况:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

自己尝试一下

锻炼#rust.m2.l2.e1
尝试:0加载中...

声明一个名为 Maybe_value 的变量,其类型为 Option<i32>,包含 Some(42)。在 Maybe_value 上使用匹配语句:如果它包含 Some(v) 则打印“值是:v”(使用 println!),如果它包含 None 则打印“无值”。

正在加载编辑器...
显示提示

编写一个 `match Maybe_value { Some(v) => println!('value is: {}', v), None => println!('no value') }` 块。

3 次尝试后可用的解决方案

锻炼#rust.m2.l2.e2
尝试:0加载中...

完成 check_age 函数,如果年龄大于或等于 18,则返回 Ok('Adult'),否则返回 Err('Minor')。

正在加载编辑器...
显示提示

使用“if Age >= 18”来决定是返回“Ok('Adult')”还是“Err('Minor')”。

3 次尝试后可用的解决方案

锻炼#rust.m2.l2.e3
尝试:0加载中...

声明一个名为 Status 的枚举,其中包含 Active 和 Inactive 变体。在 main 中,声明一个变量 current_status,其值为 Status::Active。最后,在 current_status 上使用匹配语句,如果状态为“活动”,则打印“活动”;如果状态为“非活动”,则打印“非活动”。

正在加载编辑器...
显示提示

使用 `enum Status { Active, Inactive }` 在 main 之前定义枚举。在 main 中,使用“let current_status = Status::Active;”并对变体执行“match”。

3 次尝试后可用的解决方案