Menu
CoddyTech

提供默认值:unwrap_or

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

虽然 .unwrap() 和 .expect() 可以从 Option 中提取值,但它们都有一个很大的缺点:遇到 None 时会触发 panic。为了编写更安全的代码,Rust 提供了 .unwrap_or(),这是一个不会触发 panic 的方法。

.unwrap_or() 方法将一个默认值作为参数。如果 Option 包含 Some,它会返回其中的值。如果它是 None,则会返回你提供的默认值:

let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // 输出:Score: 85

let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // 输出:Score: 0

这种方式比 .unwrap() 安全得多,因为你的程序永远不会崩溃,而且总能得到一个可用的值。

challenge icon

挑战

简单

你会收到两个输入。第一个输入是一个分数(数字),第二个输入表示分数是否可用(yes)或缺失(no)。根据可用状态创建一个 Option<i32>。使用 .unwrap_or() 安全地提取分数,并将 50 设为默认值,然后打印最终分数。

要求:

  • 读取第一个输入(分数)并去除空白字符
  • 将第一个输入解析为 i32
  • 读取第二个输入(可用状态)并去除空白字符
  • 创建一个 Option<i32> 变量:
    • 如果可用状态是 yes,则赋值为 Some(score)
    • 如果可用状态是 no,则赋值为 None
  • 使用 .unwrap_or(50) 提取分数,并将 50 设为默认值
  • 按以下格式打印最终分数:Final score: [score]

输入:

  • 第一行:表示分数的数字(例如,85)
  • 第二行:yes 或 no

输出:

  • 如果可用状态是 yes:Final score: [score](实际分数)
  • 如果可用状态是 no:Final score: 50(默认值)

亲手试试

use std::io;

fn main() {
    // 读取分数
    let mut score_input = String::new();
    io::stdin().read_line(&mut score_input).expect("Failed to read line");
    let score: i32 = score_input.trim().parse().expect("Invalid number");
    
    // 读取可用状态
    let mut availability = String::new();
    io::stdin().read_line(&mut availability).expect("Failed to read line");
    let availability = availability.trim();
    
    // TODO: 在下方编写你的代码
    // 根据可用状态创建一个 Option<i32>
    // 使用 .unwrap_or(50) 获取最终分数
    
    
    // 打印结果
    println!("Final score: {}", final_score);
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器