解包 Option
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 38 课,共 66 课。
有时,当你确定 Option 中包含 Some 时,需要提取其中的实际值。Rust 提供了 .unwrap() 方法来实现这一点,它会从 Some 中取出值并直接交给你。
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);当你对 Some(value) 调用 .unwrap() 时,它会返回内部的值。在上面的示例中,actual_number 变成了 42,不再被 Option 包裹。
不过,有一个重要警告:如果你对 None 调用 .unwrap(),程序会立即发生 panic 并崩溃。因此,.unwrap() 是一种有潜在危险的方法,只有在你完全确定 Option 中包含 Some 时才应该使用。
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // 这会触发 panic!谨慎使用 .unwrap(),只在你能确保 Option 包含值的情况下使用,例如在简单示例中,或在你已经用 .is_some() 检查过之后。
挑战
简单你会收到两个输入。第一个输入是一个数字(以字符串形式表示),第二个输入表示这个数字应被视为有效还是无效。如果第二个输入是 valid,就创建一个包含解析后数字的 Option<i32>,其中值为 Some。如果第二个输入是 invalid,就创建一个值为 None 的 Option<i32>。使用 .unwrap() 从 Option 中提取值并打印出来。
要求:
- 读取第一个输入并去除空白字符
- 读取第二个输入并去除空白字符
- 使用
.parse::<i32>()将第一个输入解析为i32 - 创建一个
Option<i32>变量:- 如果第二个输入是
valid,就赋值为Some(parsed_number) - 如果第二个输入是
invalid,就赋值为None
- 如果第二个输入是
- 使用
.unwrap()从Option中提取值 - 按照以下格式打印提取出的值:
Value: [number]
输入:
- 第一行:以字符串形式表示的数字(例如,
42) - 第二行:
valid或invalid
输出:
- 如果第二个输入是
valid:Value: [number] - 如果第二个输入是
invalid:程序会发生 panic(这是本次挑战预期的行为)
注意:当第二个输入是 invalid 时,对 None 调用 .unwrap() 会导致 panic。这展示了在不确定 Option 是否包含值时使用 .unwrap() 的危险性。
亲手试试
use std::io;
fn main() {
// 读取第一个输入(字符串形式的数字)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// 读取第二个输入(有效或无效)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// 解析数字
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO: 在下方编写你的代码
// 根据 validity_input 创建一个 Option<i32>
// 如果 validity_input 是 "valid",就赋值为 Some(parsed_number)
// 如果 validity_input 是 "invalid",就赋值为 None
// 然后用 .unwrap() 提取值,并按以下格式输出:Value: [number]
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器