Defining enums in Rust - Time & Space Complexity
When we define enums in Rust, we want to know how much time it takes to create and use them.
We ask: how does the work grow when we add more enum variants or use them in code?
Analyze the time complexity of the following code snippet.
enum Color {
Red,
Green,
Blue,
}
fn print_color(color: Color) {
match color {
Color::Red => println!("Red"),
Color::Green => println!("Green"),
Color::Blue => println!("Blue"),
}
}
This code defines an enum with three colors and a function that prints the color name.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The match statement checks the enum variant once per call.
- How many times: Exactly one time per function call; no loops or recursion here.
Since the match checks one enum value, the work stays about the same no matter how many variants exist.
| Input Size (n) | Approx. Operations |
|---|---|
| 3 (variants) | 1 check |
| 10 (variants) | 1 check |
| 100 (variants) | 1 check |
Pattern observation: The time to match an enum variant does not grow with the number of variants.
Time Complexity: O(1)
This means checking or using an enum variant takes the same amount of time no matter how many variants there are.
[X] Wrong: "More enum variants make matching slower because it has to check each one."
[OK] Correct: Rust uses efficient code to jump directly to the right variant, so matching stays fast.
Understanding how enums work and their time cost shows you know how Rust handles data efficiently, a useful skill in many coding tasks.
"What if the enum had data inside each variant? How would that affect the time complexity of matching?"
Practice
enum in Rust?Solution
Step 1: Understand what enums represent
Enums group related values under a single type name, making code clearer and safer.Step 2: Compare options with enum purpose
Only To group related values under one type name correctly describes grouping related values under one type name.Final Answer:
To group related values under one type name -> Option DQuick Check:
Enums = Group related values [OK]
- Thinking enums are for loops or functions
- Confusing enums with variables or constants
- Believing enums only hold integers
Color with variants Red, Green, and Blue?Solution
Step 1: Recall Rust enum syntax
Rust enums use curly braces with comma-separated variants, no equals or semicolons.Step 2: Check each option
enum Color { Red, Green, Blue } matches correct syntax: enum Color { Red, Green, Blue }.Final Answer:
enum Color { Red, Green, Blue } -> Option AQuick Check:
Enum syntax = curly braces with commas [OK]
- Using '=' instead of braces
- Separating variants with semicolons
- Using colon ':' after enum name
enum Direction {
North,
East,
South,
West,
}
fn main() {
let dir = Direction::East;
match dir {
Direction::North => println!("Going North"),
Direction::East => println!("Going East"),
Direction::South => println!("Going South"),
Direction::West => println!("Going West"),
}
}Solution
Step 1: Identify the enum variant assigned
The variablediris set toDirection::East.Step 2: Match statement output
The match arm forDirection::Eastprints "Going East".Final Answer:
Going East -> Option CQuick Check:
Match on Direction::East prints "Going East" [OK]
- Confusing variant names in match arms
- Forgetting to use enum name with variants
- Assuming default output without match
enum Status {
Active,
Inactive,
Pending()
}Solution
Step 1: Check variant syntax
Variants without data should not have parentheses; 'Pending()' is incorrect here.Step 2: Confirm correct enum variant style
Only variants holding data use parentheses; others are simple names.Final Answer:
The variant 'Pending' should not have parentheses unless it holds data -> Option BQuick Check:
Simple variants = no parentheses [OK]
- Adding empty parentheses to simple variants
- Thinking all variants need parentheses
- Confusing enum name rules
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}Which code correctly creates a
Message variant to move to coordinates (10, 20)?Solution
Step 1: Understand the variant type
The variantMoveuses named fields inside braces: { x: i32, y: i32 }.Step 2: Match correct syntax for named fields
let msg = Message::Move { x: 10, y: 20 }; uses correct syntax with field names and values:Move { x: 10, y: 20 }.Final Answer:
let msg = Message::Move { x: 10, y: 20 }; -> Option AQuick Check:
Named fields need braces and field names [OK]
- Using tuple syntax for struct-like variants
- Omitting field names inside braces
- Mixing tuple and struct variant syntax
Ready to prove it?
Pass the test and this pattern moves unknown
