rust语言枚举类型enum与模式匹配

在 Rust 中,enum(枚举类型,Enumeration)是一种极其强大和灵活的类型定义方式。它允许你定义一个类型,该类型可以是几种可能变体(variants)中的任意一种。
与许多其他语言(如 C/C++)中的枚举不同,Rust 的枚举不仅仅是整数值的别名,它们是具有真正数据承载能力的代数数据类型(Algebraic Data Types, ADTs)

1. 基础用法:简单的枚举

最简单的形式类似于其他语言的枚举,用于表示一组固定的、离散的可能状态:
 
// 定义一个表示颜色的枚举
enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    let my_color = Color::Red;

    // 使用 match 表达式来处理不同的变体
    match my_color {
        Color::Red => println!("是红色"),
        Color::Green => println!("是绿色"),
        Color::Blue => println!("是蓝色"),
    }
}

 

2. 核心特性:带有数据的变体

Rust enum 的强大之处在于,每个变体都可以携带不同类型和数量的数据。
 
示例:IP 地址类型
我们可以定义一个表示 IP 地址的枚举,它可以是 IPv4 或 IPv6,并且需要存储实际的地址数据:
enum IpAddr {
    V4(u8, u8, u8, u8), // IPv4 变体携带四个 u8
    V6(String),         // IPv6 变体携带一个 String
}

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

    // 匹配时可以解构出内部数据
    match home {
        IpAddr::V4(a, b, c, d) => {
            println!("IPv4 地址: {}.{}.{}.{}", a, b, c, d);
        }
        IpAddr::V6(address) => {
            println!("IPv6 地址: {}", address);
        }
    }
}

3. 最重要的内置枚举:Option<T> 和 Result<T, E>

Rust 标准库广泛使用 enum 来处理可能存在或可能失败的情况,这取代了其他语言中常见的 null(空指针)和异常处理。
A. Option<T>
Option<T> 是一个泛型枚举,用于表示一个值可能存在(Some(T))或不存在(None)。它强制你在编译时处理值不存在的可能性。
enum Option<T> {
    None,
    Some(T),
}

fn main() {
    let some_number = Some(5);
    let some_char = Some('e');
    let absent_number: Option<i32> = None;

    // 必须使用 match 或 unwrap/expect 等方法来安全地获取内部值
    match absent_number {
        Some(num) => println!("找到了数字: {}", num),
        None => println!("什么都没找到"),
    }
}

 

B. Result<T, E>
Result<T, E> 是另一个泛型枚举,用于表示操作可能成功(Ok(T))或失败(Err(E)),用于错误处理。 
enum Result<T, E> {
    Ok(T),
    Err(E),
}

4. 为枚举定义方法(impl)

像结构体一样,你可以为枚举类型定义方法:
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message {
    fn call(&self) {
        match self {
            Message::Quit => println!("退出!"),
            Message::Write(text) => println!("正在写入: {}", text),
            // ... 处理其他变体
            _ => (), // 忽略其他情况
        }
    }
}

fn main() {
    let m = Message::Write(String::from("你好"));
    m.call();
}
总结
Rust 的 enum 是一个非常强大的类型定义工具:
  • 它可以定义有限的状态集。
  • 每个变体都可以携带不同类型的数据。
  • 它与 match 表达式结合使用,提供了详尽的模式匹配能力,确保代码的健壮性。
  • 它是 Rust 内存安全的核心,用于代替空指针和异常。

 参考资料:

1.Enums and Pattern Matching

2.Rust 枚举类

 

posted @ 2025-11-25 15:40  PKICA  阅读(1)  评论(0)    收藏  举报