提供默认值: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() 安全得多,因为你的程序永远不会崩溃,而且总能得到一个可用的值。
挑战
简单你会收到两个输入。第一个输入是一个分数(数字),第二个输入表示分数是否可用(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);
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
6用 Option 处理缺失值
什么是 Option?用 match 处理 Optionis_some() 和 is_none()解包 Optionexpect 方法提供默认值:unwrap_or复习:查找一个元素自己练习: Rust 在线编译器