Matching with enums helps you choose what to do based on different named options. It makes your code clear and easy to follow.
Match with enums in Rust
enum Name { Option1, Option2, Option3, } match value { Name::Option1 => { /* code for Option1 */ }, Name::Option2 => { /* code for Option2 */ }, Name::Option3 => { /* code for Option3 */ }, }
The match keyword checks the value against each enum option.
Each arm ends with a comma and can run any code you want.
enum Direction { Up, Down, Left, Right, } let dir = Direction::Left; match dir { Direction::Up => println!("Going up!"), Direction::Down => println!("Going down!"), Direction::Left => println!("Going left!"), Direction::Right => println!("Going right!"), }
enum Light { Red, Yellow, Green, } let light = Light::Green; match light { Light::Red => println!("Stop"), Light::Yellow => println!("Get ready"), Light::Green => println!("Go"), }
enum Message { Quit, Move { x: i32, y: i32 }, Write(String), } let msg = Message::Move { x: 10, y: 20 }; match msg { Message::Quit => println!("Quit message"), Message::Move { x, y } => println!("Move to x: {}, y: {}", x, y), Message::Write(text) => println!("Write message: {}", text), }
This program checks the weather and prints a message for each type.
enum Weather { Sunny, Rainy, Windy, } fn main() { let today = Weather::Rainy; match today { Weather::Sunny => println!("It's sunny outside!"), Weather::Rainy => println!("Don't forget your umbrella."), Weather::Windy => println!("Hold onto your hat!"), } }
Every possible enum variant must be handled in the match to avoid errors.
You can use _ as a catch-all pattern if you don't want to list all variants.
Matching enums helps keep your code safe and clear by forcing you to think about all cases.
Use match to run code based on enum options.
Each enum variant is a case in the match arms.
This makes your code easy to read and safe from missing cases.
Practice
What does the match statement do when used with enums in Rust?
Solution
Step 1: Understand the purpose of
Thematchwith enumsmatchstatement compares the enum value against each variant.Step 2: Identify what happens on a match
When a variant matches, the corresponding code block runs.Final Answer:
It checks the enum variant and runs the matching code block. -> Option AQuick Check:
Match runs code by enum variant [OK]
- Thinking match converts enums to strings
- Assuming match creates or deletes variants
- Confusing match with if-else statements
Which of the following is the correct syntax to match an enum Color with variants Red, Green, and Blue?
enum Color { Red, Green, Blue }Solution
Step 1: Recall enum variant syntax in match
Enum variants must be prefixed with the enum name and double colon, likeColor::Red.Step 2: Check each option's syntax
Only match color { Color::Red => {}, Color::Green => {}, Color::Blue => {} } uses the correctColor::Variantsyntax.Final Answer:
match color { Color::Red => {}, Color::Green => {}, Color::Blue => {} } -> Option CQuick Check:
Enum variants use EnumName::Variant [OK]
- Omitting enum name prefix
- Using dot instead of double colon
- Using strings instead of variants
What will be the output of this Rust code?
enum Direction { North, South, East, West }
fn main() {
let dir = Direction::East;
let message = match dir {
Direction::North => "Going up",
Direction::South => "Going down",
Direction::East => "Going right",
Direction::West => "Going left",
};
println!("{}", message);
}Solution
Step 1: Identify the enum variant assigned
The variablediris set toDirection::East.Step 2: Match
The match arm fordirto the correct messageDirection::Eastreturns "Going right".Final Answer:
Going right -> Option AQuick Check:
Direction::East matches "Going right" [OK]
- Mixing up enum variants and their messages
- Forgetting to use EnumName::Variant in match
- Assuming default or fallback arm runs
Find the error in this Rust code snippet using match with enums:
enum Status { Success, Failure }
fn check(status: Status) {
match status {
Status::Success => println!("Success"),
// Missing Failure arm
}
}Solution
Step 1: Check completeness of match arms
The match statement coversStatus::Successbut missesStatus::Failure.Step 2: Understand Rust's exhaustiveness requirement
Rust requires all enum variants to be matched or a catch-all arm (_) to avoid compile errors.Final Answer:
Missing match arm for Status::Failure -> Option DQuick Check:
All enum variants must be matched [OK]
- Leaving out enum variants in match arms
- Assuming partial match compiles
- Confusing semicolon placement with match completeness
Given this enum with data:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}Which match arm correctly extracts the x and y values from Message::Move?
Solution
Step 1: Identify the enum variant with named fields
Moveuses named fields{ x: i32, y: i32 }.Step 2: Match syntax for named fields
UseMessage::Move { x, y }to destructure named fields directly.Final Answer:
Message::Move { x, y } => println!("x: {}, y: {}", x, y), -> Option BQuick Check:
Named fields use braces and field names [OK]
- Using tuple pattern for struct-like variant
- Mixing colon syntax incorrectly
- Omitting braces for named fields
Ready to prove it?
Pass the test and this pattern moves unknown
