Variant Payloads
You can define richer enums where the variants carry data. You can then use the
match
statement to extract the data from each variant:
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); }
- In the above example, accessing the
char
inKeyPress
, orx
andy
inClick
only works within amatch
statement. match
inspects a hidden discriminant field in theenum
.WebEvent::Click { ... }
is not exactly the same asWebEvent::Click(Click)
with a top levelstruct Click { ... }
. The inlined version cannot implement traits, for example.