| # 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 in |
| an `enum`. |
| |
| ```rust,editable |
| // Create an `enum` to classify a web event. Note how both |
| // names and type information together specify the variant: |
| // `PageLoad != PageUnload` and `KeyPress(char) != Paste(String)`. |
| // Each is different and independent. |
| enum WebEvent { |
| // An `enum` variant may either be `unit-like`, |
| PageLoad, |
| PageUnload, |
| // like tuple structs, |
| KeyPress(char), |
| Paste(String), |
| // or c-like structures. |
| Click { x: i64, y: i64 }, |
| } |
| |
| // A function which takes a `WebEvent` enum as an argument and |
| // returns nothing. |
| fn inspect(event: WebEvent) { |
| match event { |
| WebEvent::PageLoad => println!("page loaded"), |
| WebEvent::PageUnload => println!("page unloaded"), |
| // Destructure `c` from inside the `enum` variant. |
| WebEvent::KeyPress(c) => println!("pressed '{}'.", c), |
| WebEvent::Paste(s) => println!("pasted \"{}\".", s), |
| // Destructure `Click` into `x` and `y`. |
| WebEvent::Click { x, y } => { |
| println!("clicked at x={}, y={}.", x, y); |
| }, |
| } |
| } |
| |
| fn main() { |
| let pressed = WebEvent::KeyPress('x'); |
| // `to_owned()` creates an owned `String` from a string slice. |
| let pasted = WebEvent::Paste("my text".to_owned()); |
| let click = WebEvent::Click { x: 20, y: 80 }; |
| let load = WebEvent::PageLoad; |
| let unload = WebEvent::PageUnload; |
| |
| inspect(pressed); |
| inspect(pasted); |
| inspect(click); |
| inspect(load); |
| inspect(unload); |
| } |
| |
| ``` |
| |
| ## Type aliases |
| |
| If you use a type alias, you can refer to each enum variant via its alias. |
| This might be useful if the enum's name is too long or too generic, and you |
| want to rename it. |
| |
| ```rust,editable |
| enum VeryVerboseEnumOfThingsToDoWithNumbers { |
| Add, |
| Subtract, |
| } |
| |
| // Creates a type alias |
| type Operations = VeryVerboseEnumOfThingsToDoWithNumbers; |
| |
| fn main() { |
| // We can refer to each variant via its alias, not its long and inconvenient |
| // name. |
| let x = Operations::Add; |
| } |
| ``` |
| |
| The most common place you'll see this is in `impl` blocks using the `Self` alias. |
| |
| ```rust,editable |
| enum VeryVerboseEnumOfThingsToDoWithNumbers { |
| Add, |
| Subtract, |
| } |
| |
| impl VeryVerboseEnumOfThingsToDoWithNumbers { |
| fn run(&self, x: i32, y: i32) -> i32 { |
| match self { |
| Self::Add => x + y, |
| Self::Subtract => x - y, |
| } |
| } |
| } |
| ``` |
| |
| To learn more about enums and type aliases, you can read the |
| [stabilization report][aliasreport] from when this feature was stabilized into |
| Rust. |
| |
| ### See also: |
| |
| [`match`][match], [`fn`][fn], and [`String`][str], ["Type alias enum variants" RFC][type_alias_rfc] |
| |
| [c_struct]: https://en.wikipedia.org/wiki/Struct_(C_programming_language) |
| [match]: ../flow_control/match.md |
| [fn]: ../fn.md |
| [str]: ../std/str.md |
| [aliasreport]: https://github.com/rust-lang/rust/pull/61682/#issuecomment-502472847 |
| [type_alias_rfc]: https://rust-lang.github.io/rfcs/2338-type-alias-enum-variants.html |