Rust(7) - Enum

在 C 的世界中 Enum 會羅列不同的類別,透過對類別的匹配執行對應的動作。 Rust Enum 的 Enum 除了用來匹配外還能自帶資料。

1. Enum:

定義一個 Enum 因為 V4 和 V6 是同類型的概念,所以用 Enum 收集在一起。

enum IpAddKind {
    V4,
    V6,
}

螢幕的色彩模式也是同類型的概念,所以也可以用 Enum 收集在一起。

fn main() {
    let c = ColorMode::RGB;
    println!("Screen color mode: {:?}", c);
}

#[derive(Debug)]
enum ColorMode {
    Gray,
    RGB,
    BGR,
    RGBA,
}

2. 加入資料:

Rust 的 Enum 不只可以用於匹配,還能夠賦予資料。

我們將 V4 的格式設定成 Tuple, V6 設定成字串。

fn main() {
    let ip = IpAddKind::V4((127,0,0,1));
}

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

3. 撰寫匹配處理:

match 可以讓我們匹配 Enum 並執行對應動作。

匹配 V4 成功時對 Tuple 進行處理而匹配 V6 成功時對 String 進行處理。

fn main() {
    let ip = IpAddKind::V4((127,0,0,1));
    ip.show();
}

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

impl IpAddKind {
    fn show(&self) {
        match self {
            IpAddKind::V4(ip) => println!("IP V4: {}.{}.{}.{}", ip.0, ip.1, ip.2, ip.3),
            IpAddKind::V6(ip) => println!("IP V6: {}", ip),
        }
    }
}

4. 更細緻的匹配:

除了類別外還可以更近一步對資料進行匹配,下面新增 V4 127.0.0.1 時的處理。

impl IpAddKind {
    fn show(&self) {
        match self {
            IpAddKind::V4((127, 0, 0, 1)) => println!("Local host"),
            IpAddKind::V4(ip) => println!("IP V4: {}.{}.{}.{}", ip.0, ip.1, ip.2, ip.3),
            IpAddKind::V6(ip) => println!("IP V6: {}", ip),
        }
    }
}

留言

熱門文章