expect 方法
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 39 课,共 66 课。
虽然 .unwrap() 能完成任务,但它有一个很大的缺点:当它遇到 None 并触发 panic 时,错误消息很笼统,帮不上什么忙。这时,.expect() 就能派上用场。
.expect() 方法的作用与 .unwrap() 完全相同,它会从 Some 中提取值,并在遇到 None 时触发 panic。关键区别在于,.expect() 允许你提供自定义的 panic 消息:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);如果 Option 包含 Some,.expect() 会像 .unwrap() 一样返回内部的值。但如果它是 None,你会看到自定义消息,而不是通用的 panic 消息,这样就更容易理解出了什么问题,以及问题出在哪里。
挑战
简单你会收到两个输入。第一个输入是产品名称,第二个输入表示产品是否有库存(yes)或缺货(no)。如果产品有库存,则创建一个包含 Some(product_name) 的 Option<String>;如果缺货,则创建一个包含 None 的 Option<String>。使用带有描述性消息的 .expect() 提取产品名称并打印出来。
要求:
- 读取第一行输入(产品名称)并去除空白字符
- 读取第二行输入(库存状态)并去除空白字符
- 创建一个
Option<String>变量:- 如果库存状态是
yes,则赋值为Some(product_name.to_string()) - 如果库存状态是
no,则赋值为None
- 如果库存状态是
- 使用带有消息
"Product should be in stock"的.expect()提取产品名称 - 按以下格式打印提取出的产品名称:
Product available: [product_name]
输入:
- 第一行:产品名称(例如,
Laptop) - 第二行:
yes或no
输出:
- 如果库存状态是
yes:Product available: [product_name] - 如果库存状态是
no:程序会因自定义消息 "Product should be in stock" 而发生 panic(这是本挑战的预期行为)
注意:当库存状态是 no 时,对 None 调用 .expect() 会导致程序因你的自定义消息而发生 panic。这说明与 .unwrap() 相比,.expect() 能提供更有帮助的错误信息。
亲手试试
use std::io;
fn main() {
// 读取商品名称
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// 读取库存状态
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: 在下方编写你的代码
// 根据 stock_status 创建一个 Option<String>
// 使用 .expect() 提取商品名称
// 按以下格式输出结果:Product available: [product_name]
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器