4.3 枚举与 match 表达式

枚举(enumeration,简称 enum)是 Rust 中一种强大的数据类型,用于表示一组可能的值。与 C 或 Java 中仅能表示整数常量的枚举不同,Rust 的枚举每个变体(variant)可以携带不同类型和数量的数据,使其能够表达更复杂的逻辑状态。

定义和使用枚举

使用 enum 关键字定义枚举。例如,定义一个表示网络请求状态的枚举:

enum Status {
    Success(String),
    Failure(u32, String),
    Pending,
}

这里,Success 携带一个字符串(如响应内容),Failure 携带一个错误码和描述,而 Pending 不携带任何数据。

创建枚举实例时需指定具体变体:

let ok = Status::Success(String::from("Data received"));
let err = Status::Failure(404, String::from("Not Found"));
let wait = Status::Pending;

match 表达式

要使用枚举值,通常需要通过 match 表达式对所有可能的变体进行模式匹配。match 是 Rust 中处理条件逻辑的核心机制之一,它强制穷尽性检查——必须覆盖所有变体,否则编译失败。

例如,处理上述 Status

fn handle_status(s: Status) {
    match s {
        Status::Success(data) => println!("Success: {}", data),
        Status::Failure(code, msg) => println!("Error {}: {}", code, msg),
        Status::Pending => println!("Request is pending..."),
    }
}

每个分支的模式会解构出变体中携带的数据,并绑定到变量(如 datacodemsg),供分支内部使用。

match 是表达式

if 类似,match 也是表达式,可以返回值。所有分支必须返回相同类型:

let description = match wait {
    Status::Success(_) => "OK",
    Status::Failure(_, _) => "ERROR",
    Status::Pending => "WAITING",
};
println!("{}", description);

常见枚举示例:IP 地址类型

Rust 标准库中的 IpAddr 就是一个典型枚举:

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));

这种设计比使用两个独立结构体更清晰,也避免了无效状态(例如,一个 IP 地址不可能同时是 V4 和 V6)。

单元结构体风格的枚举

如果枚举变体不携带数据,其行为类似于传统枚举:

enum Direction {
    North,
    South,
    East,
    West,
}

这类枚举常用于状态机或配置选项。

小结

枚举与 match 表达式的结合,使 Rust 能够以类型安全的方式表达复杂的状态和逻辑分支。编译器确保所有情况都被处理,防止遗漏;模式匹配则提供了一种简洁、可读的方式来解构和使用数据。这种机制不仅提升了代码的健壮性,也鼓励开发者显式地思考程序的各种可能状态,是 Rust “无畏并发”和“无空指针”哲学的重要体现。

#Rust 入门教程 分享于 1 周前

内容由 AI 创作和分享,仅供参考