枚举 #

一、枚举定义 #

1.1 基本语法 #

rust
enum Direction {
    Up,
    Down,
    Left,
    Right,
}

fn main() {
    let dir = Direction::Up;
    
    match dir {
        Direction::Up => println!("向上"),
        Direction::Down => println!("向下"),
        Direction::Left => println!("向左"),
        Direction::Right => println!("向右"),
    }
}

1.2 关联数据 #

rust
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

fn main() {
    let msg = Message::Move { x: 10, y: 20 };
    
    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),
    }
}

二、Option 类型 #

2.1 定义 #

rust
enum Option<T> {
    Some(T),
    None,
}

2.2 使用 #

rust
fn main() {
    let some_number = Some(5);
    let some_string = Some("hello");
    let absent_number: Option<i32> = None;
    
    match some_number {
        Some(n) => println!("值: {}", n),
        None => println!("无值"),
    }
}

2.3 if let 简化 #

rust
fn main() {
    let some_value = Some(5);
    
    if let Some(n) = some_value {
        println!("值: {}", n);
    }
}

2.4 Option 方法 #

rust
fn main() {
    let x = Some(5);
    
    // unwrap: 获取值,None 会 panic
    println!("unwrap: {}", x.unwrap());
    
    // unwrap_or: 提供默认值
    let y: Option<i32> = None;
    println!("unwrap_or: {}", y.unwrap_or(0));
    
    // map: 转换值
    let doubled = x.map(|n| n * 2);
    println!("map: {:?}", doubled);
    
    // and_then: 链式操作
    let result = x.and_then(|n| Some(n + 1));
    println!("and_then: {:?}", result);
}

三、Result 类型 #

3.1 定义 #

rust
enum Result<T, E> {
    Ok(T),
    Err(E),
}

3.2 使用 #

rust
fn divide(a: i32, b: i32) -> Result<i32, String> {
    if b == 0 {
        Err(String::from("除零错误"))
    } else {
        Ok(a / b)
    }
}

fn main() {
    match divide(10, 2) {
        Ok(result) => println!("结果: {}", result),
        Err(e) => println!("错误: {}", e),
    }
}

3.3 ? 运算符 #

rust
fn multiply_and_divide(a: i32, b: i32, c: i32) -> Result<i32, String> {
    let quotient = divide(a, b)?;
    Ok(quotient * c)
}

fn main() {
    match multiply_and_divide(10, 2, 3) {
        Ok(result) => println!("结果: {}", result),
        Err(e) => println!("错误: {}", e),
    }
}

四、枚举方法 #

4.1 定义方法 #

rust
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
}

impl Message {
    fn call(&self) {
        match self {
            Message::Quit => println!("退出"),
            Message::Move { x, y } => println!("移动 ({}, {})", x, y),
            Message::Write(text) => println!("文本: {}", text),
        }
    }
}

fn main() {
    let msg = Message::Write(String::from("hello"));
    msg.call();
}

4.2 关联函数 #

rust
enum Status {
    Pending,
    InProgress,
    Completed,
}

impl Status {
    fn default() -> Self {
        Status::Pending
    }
}

fn main() {
    let status = Status::default();
}

五、实践示例 #

5.1 状态机 #

rust
#[derive(Debug)]
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

impl TrafficLight {
    fn next(&self) -> Self {
        match self {
            TrafficLight::Red => TrafficLight::Green,
            TrafficLight::Green => TrafficLight::Yellow,
            TrafficLight::Yellow => TrafficLight::Red,
        }
    }
    
    fn duration(&self) -> u32 {
        match self {
            TrafficLight::Red => 60,
            TrafficLight::Yellow => 5,
            TrafficLight::Green => 45,
        }
    }
}

fn main() {
    let mut light = TrafficLight::Red;
    
    for _ in 0..5 {
        println!("{:?} - {}秒", light, light.duration());
        light = light.next();
    }
}

5.2 表达式求值 #

rust
enum Expr {
    Number(i32),
    Add(Box<Expr>, Box<Expr>),
    Multiply(Box<Expr>, Box<Expr>),
}

impl Expr {
    fn evaluate(&self) -> i32 {
        match self {
            Expr::Number(n) => *n,
            Expr::Add(a, b) => a.evaluate() + b.evaluate(),
            Expr::Multiply(a, b) => a.evaluate() * b.evaluate(),
        }
    }
}

fn main() {
    // (2 + 3) * 4
    let expr = Expr::Multiply(
        Box::new(Expr::Add(
            Box::new(Expr::Number(2)),
            Box::new(Expr::Number(3)),
        )),
        Box::new(Expr::Number(4)),
    );
    
    println!("结果: {}", expr.evaluate());
}

六、总结 #

本章学习了:

  • 枚举定义和变体
  • 关联数据
  • Option 类型
  • Result 类型
  • 枚举方法

下一章,我们将学习数组与切片。

最后更新:2026-03-27