@@ -61,3 +61,40 @@ let number = match x {
61
61
```
62
62
63
63
Sometimes it’s a nice way of converting something from one type to another.
64
+
65
+ # Matching on enums
66
+
67
+ Another important use of the ` match ` keyword is to process the possible
68
+ variants of an enum:
69
+
70
+ ``` rust
71
+ enum Message {
72
+ Quit ,
73
+ ChangeColor (i32 , i32 , i32 ),
74
+ Move { x : i32 , y : i32 },
75
+ Write (String ),
76
+ }
77
+
78
+ fn quit () { /* ... */ }
79
+ fn change_color (r : i32 , g : i32 , b : i32 ) { /* ... */ }
80
+ fn move_cursor (x : i32 , y : i32 ) { /* ... */ }
81
+
82
+ fn process_message (msg : Message ) {
83
+ match msg {
84
+ Message :: Quit => quit (),
85
+ Message :: ChangeColor (r , g , b ) => change_color (r , g , b ),
86
+ Message :: Move { x : x , y : y } => move_cursor (x , y ),
87
+ Message :: Write (s ) => println! (" {}" , s ),
88
+ };
89
+ }
90
+ ```
91
+
92
+ Again, the Rust compiler checks exhaustiveness, so it demands that you
93
+ have a match arm for every variant of the enum. If you leave one off, it
94
+ will give you a compile-time error unless you use ` _ ` .
95
+
96
+ Unlike the previous uses of ` match ` , you can’t use the normal ` if `
97
+ statement to do this. You can use the [ ` if let ` ] [ if-let ] statement,
98
+ which can be seen as an abbreviated form of ` match ` .
99
+
100
+ [ if-let] [ if-let.html ]
0 commit comments