summaryrefslogtreecommitdiffstats
path: root/src/doc/rust-by-example/src/custom_types/enum.md
diff options
context:
space:
mode:
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.md109
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