變體負載

您可以定義更豐富的列舉,讓列舉的變體攜帶資料。接著,您可以使用 match 陳述式,從各個變體擷取資料:

enum WebEvent {
    PageLoad,                 // Variant without payload
    KeyPress(char),           // Tuple struct variant
    Click { x: i64, y: i64 }, // Full struct variant
}

#[rustfmt::skip]
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad       => println!("page loaded"),
        WebEvent::KeyPress(c)    => println!("pressed '{c}'"),
        WebEvent::Click { x, y } => println!("clicked at x={x}, y={y}"),
    }
}

fn main() {
    let load = WebEvent::PageLoad;
    let press = WebEvent::KeyPress('x');
    let click = WebEvent::Click { x: 20, y: 80 };

    inspect(load);
    inspect(press);
    inspect(click);
}
  • 只有在與模式配對相符後,才能存取列舉變數中的值。此模式會將參照繫結至 => 後方「配對分支」中的欄位。
    • 系統會從上到下將運算式與模式進行配對。在 Rust 中,不會像在 C 或 C++ 中一樣出現貫穿 (fall-through) 情形。
    • 配對運算式具有值。此值是系統執行的配對分支中的最後一個運算式。
    • 我們會從上方開始尋找符合該值的模式,然後執行箭頭後方的程式碼。一旦發現相符項目,就會停止。
  • 請示範非窮舉搜尋的情況。請確認系統處理所有案例的時間,指出 Rust 編譯器提供的優勢。
  • match 會檢查 enum 中隱藏的判別值欄位。
  • 只要呼叫 std::mem::discriminant(),就有可能擷取該判別值。`
    • 舉例來說,如果在為結構體實作 PartialEq 時,比較欄位值不會對相等性造成影響,這種做法就很實用。
  • WebEvent::Click { ... } 與具有頂層 struct Click { ... }WebEvent::Click(Click) 並非完全相同。舉例來說,內嵌版本無法實作特徵。