diff options
Diffstat (limited to 'src/doc/rust-by-example/src/custom_types/enum.md')
-rw-r--r-- | src/doc/rust-by-example/src/custom_types/enum.md | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/doc/rust-by-example/src/custom_types/enum.md b/src/doc/rust-by-example/src/custom_types/enum.md new file mode 100644 index 000000000..e861df9bf --- /dev/null +++ b/src/doc/rust-by-example/src/custom_types/enum.md @@ -0,0 +1,109 @@ +# 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`. + +```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` 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`. + 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 |