blog.dopana

Back

这是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})"),
    }
}
rust

Option 枚举:替代 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)”。

参考资料#