Enums

The enum keyword allows the creation of a type which may be one of a few
different variants. Any variant which is valid as a struct is also valid as
an enum.

  1. // An attribute to hide warnings for unused code.
  2. #![allow(dead_code)]
  3. // Create an `enum` to classify a web event. Note how both
  4. // names and type information together specify the variant:
  5. // `PageLoad != PageUnload` and `KeyPress(char) != Paste(String)`.
  6. // Each is different and independent.
  7. enum WebEvent {
  8. // An `enum` may either be `unit-like`,
  9. PageLoad,
  10. PageUnload,
  11. // like tuple structs,
  12. KeyPress(char),
  13. Paste(String),
  14. // or like structures.
  15. Click { x: i64, y: i64 },
  16. }
  17. // A function which takes a `WebEvent` enum as an argument and
  18. // returns nothing.
  19. fn inspect(event: WebEvent) {
  20. match event {
  21. WebEvent::PageLoad => println!("page loaded"),
  22. WebEvent::PageUnload => println!("page unloaded"),
  23. // Destructure `c` from inside the `enum`.
  24. WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
  25. WebEvent::Paste(s) => println!("pasted \"{}\".", s),
  26. // Destructure `Click` into `x` and `y`.
  27. WebEvent::Click { x, y } => {
  28. println!("clicked at x={}, y={}.", x, y);
  29. },
  30. }
  31. }
  32. fn main() {
  33. let pressed = WebEvent::KeyPress('x');
  34. // `to_owned()` creates an owned `String` from a string slice.
  35. let pasted = WebEvent::Paste("my text".to_owned());
  36. let click = WebEvent::Click { x: 20, y: 80 };
  37. let load = WebEvent::PageLoad;
  38. let unload = WebEvent::PageUnload;
  39. inspect(pressed);
  40. inspect(pasted);
  41. inspect(click);
  42. inspect(load);
  43. inspect(unload);
  44. }

See also:

attributes, match, fn, and String