用 match 处理 Option
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 36 课,共 66 课。
现在你已经了解了 Option 是什么,接下来学习处理它最常见、最明确的方法:使用 match 表达式。这种方法会让你考虑两种可能的情况:有值和没有值。
match 表达式与 Option 配合得非常好,因为你可以为两个变体分别创建分支:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}注意,Some(name) 分支会提取 Some 变体中的值。变量 name 现在包含实际的 String,而不是 Option。这称为解构,也就是从包装器中取出内部的值。
None 分支用于处理没有值的情况,让你可以提供替代行为,例如显示默认消息或采取完全不同的操作。
挑战
简单你会收到一个学生姓名作为输入。系统中可能有这个姓名,也可能没有。如果姓名不为空,就创建一个包含 Some(name) 的 Option<String>;如果姓名为空,则创建 None。使用 match 表达式处理这两种情况,并打印相应的消息。
要求:
- 将输入读取为字符串(学生姓名)
- 使用
.trim()去除输入中的空白字符 - 创建一个
Option<String>变量:- 如果去除空白字符后的姓名不为空,则赋值为
Some(name.to_string()) - 如果去除空白字符后的姓名为空,则赋值为
None
- 如果去除空白字符后的姓名不为空,则赋值为
- 使用
match表达式处理Option的两种变体 - 在
Some(name)分支中,打印:Welcome, [name]! - 在
None分支中,打印:No name provided
输入:
- 一行内容,可以是学生姓名,也可以是空行
输出:
- 如果提供了姓名:
Welcome, [name]! - 如果没有提供姓名(输入为空):
No name provided
亲手试试
use std::io;
fn main() {
// 读取输入
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim();
// TODO: 根据 name 是否为空,创建一个 Option<String>
// TODO: 使用 match 表达式处理 Some 和 None 两种情况,并打印相应的消息
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
6用 Option 处理缺失值
什么是 Option?用 match 处理 Optionis_some() 和 is_none()解包 Optionexpect 方法提供默认值:unwrap_or复习:查找一个元素自己练习: Rust 在线编译器