Bird
Raised Fist0
Rustprogramming~10 mins

Enums with data in Rust - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Enums with data
Define Enum with Variants
↓
Create Enum Instance with Data
↓
Match on Enum Instance
↓
Extract Data from Variant
↓
Use Data in Code
This flow shows how to define an enum with data, create an instance, match it, extract the data, and use it.
Execution Sample
Rust
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
}

fn main() {
    let msg = Message::Move { x: 10, y: 20 };
    match msg {
        Message::Move { x, y } => println!("Move to ({}, {})", x, y),
        _ => (),
    }
}
This code defines an enum with data, creates a Move variant with x and y, then matches and prints the coordinates.
Execution Table
StepActionEnum InstanceMatch PatternExtracted DataOutput
1Define enum Message with variants Quit, Move, Write----
2Create instance msg = Message::Move { x: 10, y: 20 }Message::Move { x: 10, y: 20 }---
3Match msg against Message::Move { x, y }Message::Move { x: 10, y: 20 }Message::Move { x, y }x=10, y=20-
4Execute println! with extracted x and yMessage::Move { x: 10, y: 20 }Message::Move { x, y }x=10, y=20Move to (10, 20)
5Match ends, no other patterns matched----
💡 Matching completes after handling the Move variant and printing coordinates.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
msg-Message::Move { x: 10, y: 20 }Message::Move { x: 10, y: 20 }Message::Move { x: 10, y: 20 }
x--1010
y--2020
Key Moments - 2 Insights
Why do we use curly braces { } in the Move variant inside the enum?
The curly braces define named fields (like x and y) inside the Move variant, allowing us to store multiple pieces of data together. See execution_table step 2 where msg is created with x=10 and y=20.
How does the match statement extract the values x and y from the enum?
In the match pattern Message::Move { x, y }, Rust binds the fields x and y from the enum instance to new variables x and y. This is shown in execution_table step 3 where extracted data is x=10 and y=20.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3, what values are extracted from the enum?
Ax=20, y=10
Bx=10, y=20
CNo values extracted
Dx=0, y=0
💡 Hint
Check the 'Extracted Data' column at step 3 in the execution_table.
At which step does the program print the output?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at the 'Output' column in the execution_table to find when printing happens.
If we changed msg to Message::Write(String::from("Hi")), what would the match need to do?
AMatch Message::Write(s) and extract s
BMatch Message::Move { x, y } as before
CNo match needed
DMatch Message::Quit
💡 Hint
Think about how the enum variants hold different data types and how match patterns extract them.
Concept Snapshot
enum Message {
  Quit,
  Move { x: i32, y: i32 },
  Write(String),
}

Create instance: let msg = Message::Move { x: 10, y: 20 };
Match and extract data:
match msg {
  Message::Move { x, y } => println!("Move to ({}, {})", x, y),
  _ => (),
}

Use curly braces for named fields, parentheses for tuple-like data.
Full Transcript
This example shows how to use enums with data in Rust. First, we define an enum Message with three variants: Quit with no data, Move with named fields x and y, and Write with a String. We create an instance msg as Message::Move with x=10 and y=20. Then we use a match statement to check which variant msg is. When it matches Message::Move, it extracts the x and y values and prints them. This lets us store different kinds of data in one enum and handle each case clearly.

Practice

(1/5)
1. What is the main purpose of enums with data in Rust?
easy
A. To group related values that can be different types under one name
B. To create multiple copies of the same data
C. To perform arithmetic operations on numbers
D. To store only strings in a list

Solution

  1. Step 1: Understand what enums with data do

    Enums with data allow each variant to hold different types or amounts of data, grouping related but different information.
  2. Step 2: Compare options with this understanding

    Only To group related values that can be different types under one name correctly describes grouping related values of different types under one name.
  3. Final Answer:

    To group related values that can be different types under one name -> Option A
  4. Quick Check:

    Enums with data = group different types [OK]
Hint: Enums group different data types under one name [OK]
Common Mistakes:
  • Thinking enums only store one data type
  • Confusing enums with arrays or vectors
  • Assuming enums perform calculations
2. Which of the following is the correct syntax to define an enum variant with data in Rust?
easy
A. enum Color { Red(u8, u8, u8), Blue }
B. enum Color { Red = (u8, u8, u8), Blue }
C. enum Color { Red: (u8, u8, u8), Blue }
D. enum Color { Red -> (u8, u8, u8), Blue }

Solution

  1. Step 1: Recall enum variant syntax with data

    In Rust, enum variants with data are defined by listing the variant name followed by parentheses containing the data types.
  2. Step 2: Check each option

    enum Color { Red(u8, u8, u8), Blue } uses correct syntax: Red(u8, u8, u8). Options A, B, and C use invalid syntax with ->, =, or : which are incorrect for enum variant data.
  3. Final Answer:

    enum Color { Red(u8, u8, u8), Blue } -> Option A
  4. Quick Check:

    Variant with data uses parentheses () [OK]
Hint: Use parentheses () after variant name for data [OK]
Common Mistakes:
  • Using = instead of () for variant data
  • Using : or -> which are invalid here
  • Forgetting parentheses for data
3. What will be the output of this Rust code?
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
}

fn main() {
    let msg = Message::Move { x: 10, y: 20 };
    match msg {
        Message::Quit => println!("Quit"),
        Message::Move { x, y } => println!("Move to {}, {}", x, y),
        Message::Write(text) => println!("Write {}", text),
    }
}
medium
A. Compilation error
B. Quit
C. Write 10, 20
D. Move to 10, 20

Solution

  1. Step 1: Identify the enum variant used

    The variable msg is assigned Message::Move with x=10 and y=20.
  2. Step 2: Match arms and output

    The match statement checks msg. For Message::Move, it prints "Move to {}, {}" with x and y values, so output is "Move to 10, 20".
  3. Final Answer:

    Move to 10, 20 -> Option D
  4. Quick Check:

    Match Message::Move prints coordinates [OK]
Hint: Match variant and print its data fields [OK]
Common Mistakes:
  • Confusing variant names
  • Expecting Quit or Write output
  • Thinking code won't compile
4. The following Rust code has an error. What is the problem?
enum Shape {
    Circle(f64),
    Rectangle { width: f64, height: f64 },
}

fn area(shape: Shape) -> f64 {
    match shape {
        Shape::Circle(radius) => 3.14 * radius * radius,
        Shape::Rectangle(width, height) => width * height,
    }
}
medium
A. Missing semicolon after match arms
B. Circle variant should have named fields
C. Incorrect pattern for Rectangle variant in match
D. Function return type should be i32

Solution

  1. Step 1: Check enum variant definitions

    Circle has tuple data (f64), Rectangle has named fields { width, height }.
  2. Step 2: Check match patterns

    Circle pattern is correct. Rectangle pattern uses (width, height) which is wrong; it should use { width, height } to match named fields.
  3. Final Answer:

    Incorrect pattern for Rectangle variant in match -> Option C
  4. Quick Check:

    Match named fields with braces {} [OK]
Hint: Match named fields with braces {}, tuple fields with () [OK]
Common Mistakes:
  • Using parentheses for named fields
  • Ignoring pattern mismatch errors
  • Changing return type unnecessarily
5. Given this enum and function, what is the output?
enum Event {
    Click { x: i32, y: i32 },
    KeyPress(char),
    Resize(u32, u32),
}

fn describe(event: Event) -> String {
    match event {
        Event::Click { x, y } if x > 0 && y > 0 => format!("Clicked at positive coords: {}, {}", x, y),
        Event::Click { .. } => "Clicked at non-positive coords".to_string(),
        Event::KeyPress(c) if c.is_alphabetic() => format!("Key pressed: {}", c),
        Event::KeyPress(_) => "Non-alphabetic key pressed".to_string(),
        Event::Resize(w, h) if w == h => "Resized to square".to_string(),
        Event::Resize(_, _) => "Resized to rectangle".to_string(),
    }
}

fn main() {
    let e = Event::Resize(100, 100);
    println!("{}", describe(e));
}
hard
A. Clicked at positive coords: 100, 100
B. Resized to square
C. Resized to rectangle
D. Non-alphabetic key pressed

Solution

  1. Step 1: Identify the enum variant and values

    The event is Event::Resize with width=100 and height=100.
  2. Step 2: Match arms with conditions

    The Resize arm with condition w == h matches because 100 == 100, so it returns "Resized to square".
  3. Final Answer:

    Resized to square -> Option B
  4. Quick Check:

    Resize with equal sides = square [OK]
Hint: Check match guards (if conditions) carefully [OK]
Common Mistakes:
  • Ignoring if conditions in match arms
  • Confusing Resize with Click variant
  • Assuming default arm without conditions
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard