模块课程(2/2)
模式匹配、选项和结果
Rust 有一个极其强大的控制流机制,称为“模式匹配”。它允许您将值与一系列模式进行比较,并根据模式匹配执行代码。
match 语句
Rust 中的 match 语句与其他语言中的 switch 类似,但更强大和安全。编译器确保匹配是详尽的,这意味着必须处理所有可能的情况:
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:表示缺少值。
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。
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 允许使用通配符 _ 来捕获所有未明确定义的剩余情况:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}自己尝试一下
声明一个名为 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 次尝试后可用的解决方案
完成 check_age 函数,如果年龄大于或等于 18,则返回 Ok('Adult'),否则返回 Err('Minor')。
显示提示
使用“if Age >= 18”来决定是返回“Ok('Adult')”还是“Err('Minor')”。
3 次尝试后可用的解决方案
声明一个名为 Status 的枚举,其中包含 Active 和 Inactive 变体。在 main 中,声明一个变量 current_status,其值为 Status::Active。最后,在 current_status 上使用匹配语句,如果状态为“活动”,则打印“活动”;如果状态为“非活动”,则打印“非活动”。
显示提示
使用 `enum Status { Active, Inactive }` 在 main 之前定义枚举。在 main 中,使用“let current_status = Status::Active;”并对变体执行“match”。
3 次尝试后可用的解决方案