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
or anif let
statement. match
andif let
inspect a hidden discriminant field in theenum
.- It is possible to retrieve the discriminant by calling
std::mem::discriminant()
- This is useful, for example, if implementing
PartialEq
for structs where comparing field values doesn’t affect equality.
- This is useful, for example, if implementing
WebEvent::Click { ... }
is not exactly the same asWebEvent::Click(Click)
with a top levelstruct Click { ... }
. The inlined version cannot implement traits, for example.