Menu
CoddyTech

快捷方法:unwrap 和 expect

本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 45 课,共 66 课。

你已经学习过 Option 中的 .unwrap() 和 .expect(),这两个方法也适用于 Result。不过,在处理成功和失败的情况时,它们的行为略有不同。

.unwrap() 方法会从 Ok 变体中提取值,但如果 Result 是 Err,程序就会发生 panic 并崩溃。同样,.expect() 也会执行相同的操作,但允许你提供自定义的 panic 消息,让调试更轻松:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // 打印:Value: 42

// 这会触发 panic,并显示自定义消息:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // 触发 panic!

虽然这些方法可以快速获取成功的值,但使用时要谨慎。只有在你完全确定操作会成功时,或在开发和测试期间,才最适合使用它们。

challenge icon

挑战

简单

你会收到两个输入。第一个输入是一个数字(以字符串形式表示),第二个输入是状态指示符(ok 或 error)。根据状态创建一个 Result<i32, &'static str>。如果状态是 ok,就创建一个包含解析后数字的 Ok。如果状态是 error,就创建一个包含消息 "Invalid operation" 的 Err。使用带有自定义消息的 .expect() 从 Result 中提取值,并将其打印出来。

要求:

  • 读取第一个输入(数字)并去除空白
  • 将第一个输入解析为 i32
  • 读取第二个输入(状态)并去除空白
  • 创建一个 Result<i32, &'static str> 变量:
    • 如果状态是 ok,赋值为 Ok(parsed_number)
    • 如果状态是 error,赋值为 Err("Invalid operation")
  • 使用 .expect("Failed to get value") 从 Result 中提取值
  • 按以下格式打印提取的值:Value: [value]

输入:

  • 第一行:一个数字(例如,75)
  • 第二行:ok 或 error

输出:

  • 如果状态是 ok:Value: [number]
  • 如果状态是 error:程序会因自定义消息而发生 panic(本挑战不会对此进行测试)

注意:对于此挑战,测试用例只会使用 ok 状态,以确保程序成功运行。error 情况会导致 panic,这是 .expect() 遇到 Err 时的预期行为。

亲手试试

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();
    
    // 将数字解析为 i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // 读取第二个输入(status)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO:在下方编写你的代码
    // 根据 status 创建一个 Result<i32, &'static str>
    // 使用 .expect() 提取值
    // 按以下格式打印结果:Value: [value]
    
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器