Menu
CoddyTech

解包 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() 检查过之后。

challenge icon

挑战

简单

你会收到两个输入。第一个输入是一个数字(以字符串形式表示),第二个输入表示这个数字应被视为有效还是无效。如果第二个输入是 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]
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Rust 在线编译器