變體負載
您可以定義更豐富的列舉,讓列舉的變體攜帶資料。接著,您可以使用 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)
並非完全相同。舉例來說,內嵌版本無法實作特徵。