Menu
CoddyTech

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 消息,这样就更容易理解出了什么问题,以及问题出在哪里。

challenge icon

挑战

简单

你会收到两个输入。第一个输入是产品名称,第二个输入表示产品是否有库存(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]
    
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器