快捷方法: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!虽然这些方法可以快速获取成功的值,但使用时要谨慎。只有在你完全确定操作会成功时,或在开发和测试期间,才最适合使用它们。
挑战
简单你会收到两个输入。第一个输入是一个数字(以字符串形式表示),第二个输入是状态指示符(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]
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
7使用 Result 处理错误
什么是 Result?在 Result 中使用 matchis_ok() 和 is_err()快捷方法:unwrap 和 expect问号运算符“?”将字符串解析为数字回顾:安全的除法函数自己练习: Rust 在线编译器