iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Rust

Rust 30 天養成計畫:從零到 CLI 專案系列 第 12

Day 12:Enum(列舉型別)

  • 分享至 

  • xImage
  •  

1. Enum 基本用法
Enum(enumeration)用來定義一組可能的變體 (variant),每個變體都是這個 enum 型別的其中一個值。

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

fn main() {
    let d = Direction::Left;
    match d {
        Direction::Up => println!("Go up"),
        Direction::Down => println!("Go down"),
        Direction::Left => println!("Go left"),
        Direction::Right => println!("Go right"),
    }
}

輸出:

Go left

2. Enum 可以帶資料
變體不只是一個名字,也可以攜帶額外的資料。

enum Message {
    Quit,                 // 沒有資料
    Move { x: i32, y: i32 }, // 結構體形式
    Write(String),        // 單一值
    ChangeColor(i32, i32, i32), // 元組形式
}

fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move { x: 10, y: 20 };
    let m3 = Message::Write(String::from("hello"));
    let m4 = Message::ChangeColor(255, 0, 0);

    match m2 {
        Message::Move { x, y } => println!("Move to ({}, {})", x, y),
        _ => println!("Other message"),
    }
}

輸出:

Move to (10, 20)

3. Enum 與 impl
Enum 也能用 impl 定義方法。

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

impl IpAddr {
    fn display(&self) {
        match self {
            IpAddr::V4(addr) => println!("IPv4: {}", addr),
            IpAddr::V6(addr) => println!("IPv6: {}", addr),
        }
    }
}

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

    home.display();
    loopback.display();
}

輸出:

IPv4: 127.0.0.1
IPv6: ::1

這說明 enum 不只是標記狀態,它也能和方法結合,像 struct 一樣有行為。

4. Enum 與標準庫常見應用
Rust 標準庫有很多重要的 enum,例如:

  • Option:代表「有值」或「沒有值」。
  • Result<T, E>:代表「成功」或「失敗」。
    這兩個 enum 幾乎貫穿所有 Rust 程式,Option 常用來避免 null,Result 常用來處理錯誤。

5. 學習心得與補充
今天學到的 enum 讓我覺得 Rust 在資料表達上的彈性又更上一層。和昨天的 struct 相比,struct 是一個型別裡面有多個欄位,而 enum 是一個型別可以有多種狀態。這讓我覺得很像是把 if/else 判斷換成一種更清楚的型別描述。最有趣的是,enum 還能像 struct 一樣帶資料,甚至可以混用結構體形式、元組形式,讓它的表達能力更強。我覺得這個概念跟前幾天 struct 的知識剛好互補,一個負責組合資料,一個負責分支狀態,兩個放在一起,整個語言的設計感覺就更完整了。


上一篇
Day 11:Struct 的方法與關聯函數
下一篇
Day 13:Option 與模式比對 (match)
系列文
Rust 30 天養成計畫:從零到 CLI 專案13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言