Rust枚举与模式匹配
掌握包含数据的枚举类型,使用match表达式进行穷尽模式匹配,通过Option处理null安全,以及使用if let简化代码。
这是Rust基础系列的第8篇文章。枚举(Enum)允许通过列举可能存在的变体来定义一个类型。结合模式匹配(Pattern Matching),Rust中的枚举能提供强大且类型状态安全控制流。
定义带有数据的枚举#
与C语言风格的枚举不同,Rust中的枚举变体可以直接包含数据:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg1 = Message::Write(String::from("hello"));
let msg2 = Message::Move { x: 10, y: 20 };
}rust使用 match 进行模式匹配#
match 表达式检查枚举变体并提取其内部数据。Rust中的模式匹配是穷尽的(exhaustive)——必须覆盖每一种可能的变体:
fn process(msg: Message) {
match msg {
Message::Quit => println!("收到退出信号"),
Message::Move { x, y } => println!("移动到 ({x}, {y})"),
Message::Write(text) => println!("文本消息:{text}"),
Message::ChangeColor(r, g, b) => println!("修改颜色为 ({r}, {g}, {b})"),
}
}rustOption 枚举:替代 null#
Rust没有 null 的概念。标准库使用 Option<T> 枚举来表示值的存在与否:
enum Option<T> {
Some(T),
None,
}rust因为 Option<T> 与 T 是不同的类型,编译器会强制你在访问 T 之前必须先处理 None 的情况:
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let absent = plus_one(None);rust使用 if let 进行简洁匹配#
当你只关心匹配某一个特定的变体而忽略其他分支时,可以使用 if let 简写:
let config_max = Some(8u8);
if let Some(max) = config_max {
println!("最大值配置为 {max}");
}rust总结#
枚举用于表示可能属于多种情况之一的数据,match 确保所有情况被安全无漏地处理,而 Option 则彻底消除了空指针异常。本系列的下一篇文章将讨论“集合(Vec、String、HashMap)”。