豹子头 (雷豹)

戚秦氏,你可知罪?你犯的可是...

A. 杀人罪? B. 纵火罪? C. 还是欺负我这个老实人?

包龙星

等等!这还是个选择题啊?

方唐镜

大人,这就叫枚举 (Enum)。无论怎么选,都跑不出这几个选项!

Rust 枚举:穷举罪名

枚举 (Enumerations) 允许你通过列举可能的 成员 (Variants) 来定义一个类型。

🔢 定义枚举

enum Crime {
    Murder,
    Arson,
    Bribery,
}

fn main() {
    let current_crime = Crime::Bribery;
}

📦 带数据的枚举

Rust 的枚举非常强大,成员可以携带不同类型的数据。

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

🎲 Option 枚举

Rust 没有 Null!它使用 Option<T> 来表示“可能有值,也可能没值”。

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

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

🧩 match 控制流

match 就像更强大的 switch,必须覆盖所有可能性(穷尽性检查)。

enum Crime {
    Murder,
    Bribery(u32), // 受贿金额
}

fn judge(c: Crime) {
    match c {
        Crime::Murder => println!("死刑!"),
        Crime::Bribery(amount) => {
            println!("受贿 {} 两?充公!", amount);
        },
    }
}

🤔 if let 语法

如果你只关心一种匹配情况,可以用 if let

let config_max = Some(3u8);
if let Some(max) = config_max {
    println!("最大值是 {}", max);
}
⚖️

动手时刻:判官断案

编写一个断案程序。

  1. 定义枚举 Verdict (判决),包含 Guilty(String) (有罪,带罪名) 和 Innocent (无罪)。
  2. 编写函数 sentence(v: Verdict),使用 match 处理。
  3. 如果 Guilty,打印 "有罪!罪名:xxx"。
  4. 如果 Innocent,打印 "当庭释放!"。
  5. 在 main 中测试。
查看参考答案 (点击揭榜)

enum Verdict {
    Guilty(String),
    Innocent,
}

fn sentence(v: Verdict) {
    match v {
        Verdict::Guilty(reason) => println!("有罪!罪名:{}", reason),
        Verdict::Innocent => println!("当庭释放!回家吃奶去吧!"),
    }
}

fn main() {
    let v1 = Verdict::Guilty(String::from("欺负常威"));
    let v2 = Verdict::Innocent;
    
    sentence(v1);
    sentence(v2);
}
                    

成就解锁:【铁面无私】 🧑‍⚖️