Bird
Raised Fist0
Rustprogramming~7 mins

Match expression deep dive in Rust

Choose your learning style10 modes available
Introduction

The match expression helps you check a value against many patterns and run code based on which pattern fits. It makes your code clear and safe.

When you want to do different things based on the exact value or shape of data.
When you have multiple possible cases and want to handle each clearly.
When you want to safely unpack data inside enums or tuples.
When you want to catch all other cases with a default action.
When you want to combine conditions and bind parts of data to variables.
Syntax
Rust
match value {
    pattern1 => expression1,
    pattern2 if condition => expression2,
    pattern3 => {
        // multiple lines of code
    },
    _ => default_expression,
}

Each pattern is checked in order until one matches.

The underscore _ means "anything else" and acts like a default case.

Examples
Match a number and print if it is 1, a prime (2,3,5,7), or something else.
Rust
let number = 3;
match number {
    1 => println!("One"),
    2 | 3 | 5 | 7 => println!("Prime number"),
    _ => println!("Other number"),
}
Match a tuple and bind parts to variables to use inside the code.
Rust
let pair = (0, -2);
match pair {
    (0, y) => println!("First is zero, second is {}", y),
    (x, 0) => println!("First is {}, second is zero", x),
    _ => println!("No zeros"),
}
Use a guard if to add extra condition to a pattern.
Rust
let x = Some(5);
match x {
    Some(n) if n > 3 => println!("Big number {}", n),
    Some(n) => println!("Small number {}", n),
    None => println!("No number"),
}
Sample Program

This program matches a tuple (2, 3) against several patterns with conditions. It prints the message for the first matching case.

Rust
fn main() {
    let value = (2, 3);
    match value {
        (x, y) if x == y => println!("Both are equal: {}", x),
        (x, y) if x + y == 5 => println!("Sum is five: {} + {}", x, y),
        (x, _) if x > 0 => println!("First is positive: {}", x),
        _ => println!("No special case"),
    }
}
OutputSuccess
Important Notes

Patterns are checked top to bottom, so order matters.

Use if guards to add extra checks beyond pattern shape.

The match expression must cover all possible cases, or the code won't compile.

Summary

Match lets you compare a value to many patterns clearly.

You can bind parts of data to variables inside patterns.

Use if guards for extra conditions and _ for a default case.

Practice

(1/5)
1. What does the match expression do in Rust?
easy
A. It loops over a range of numbers.
B. It creates a new variable with a fixed value.
C. It defines a function with multiple parameters.
D. It compares a value against multiple patterns and executes matching code.

Solution

  1. Step 1: Understand the purpose of match

    The match expression is used to compare a value against several patterns.
  2. Step 2: Identify what happens on a match

    When a pattern matches, the corresponding code block runs, making match a clear way to handle multiple cases.
  3. Final Answer:

    It compares a value against multiple patterns and executes matching code. -> Option D
  4. Quick Check:

    Match expression = pattern matching [OK]
Hint: Match compares values to patterns and runs matching code [OK]
Common Mistakes:
  • Thinking match creates variables
  • Confusing match with loops
  • Assuming match defines functions
2. Which of the following is the correct syntax for a simple match expression in Rust?
easy
A. match value { 1 => println!("One") else println!("Other") }
B. match value { 1 => println!("One"), _ => println!("Other") }
C. match value { 1 -> println!("One"), _ -> println!("Other") }
D. match (value) { 1: println!("One"), _ : println!("Other") }

Solution

  1. Step 1: Recall Rust match syntax

    Rust uses curly braces with patterns followed by => and the code to run.
  2. Step 2: Check each option

    match value { 1 => println!("One"), _ => println!("Other") } uses correct syntax with => and a default case using _; others use invalid symbols like : or -> or else.
  3. Final Answer:

    match value { 1 => println!("One"), _ => println!("Other") } -> Option B
  4. Quick Check:

    Correct match syntax uses => and _ for default [OK]
Hint: Use => for patterns and _ for default case in match [OK]
Common Mistakes:
  • Using : or -> instead of =>
  • Omitting commas between arms
  • Using else instead of _ for default
3. What is the output of this Rust code?
let x = Some(5);
match x {
  Some(n) if n > 3 => println!("Greater than 3: {}", n),
  Some(n) => println!("Less or equal to 3: {}", n),
  None => println!("No value"),
}
medium
A. Greater than 3: 5
B. Less or equal to 3: 5
C. No value
D. Compilation error

Solution

  1. Step 1: Analyze the match arms and value

    The value is Some(5). The first arm matches Some(n) with a guard n > 3.
  2. Step 2: Check the guard condition

    Since 5 > 3 is true, the first arm runs and prints "Greater than 3: 5".
  3. Final Answer:

    Greater than 3: 5 -> Option A
  4. Quick Check:

    Guard true triggers first arm output [OK]
Hint: Check if guards are true to pick correct match arm [OK]
Common Mistakes:
  • Ignoring the if guard condition
  • Choosing second arm without checking guard
  • Thinking None matches Some value
4. Identify the error in this Rust match expression:
let num = 2;
match num {
  1 => println!("One"),
  2 => println!("Two")
  3 => println!("Three"),
  _ => println!("Other"),
}
medium
A. Match arms must be in parentheses, not braces.
B. Using _ as default case is invalid.
C. Missing comma after the second arm (2 => ...).
D. Cannot match integer values directly.

Solution

  1. Step 1: Check syntax of each match arm

    Each arm must end with a comma except possibly the last. The second arm lacks a comma after println!("Two").
  2. Step 2: Validate other parts

    Using _ is valid for default, braces are correct, and matching integers is allowed.
  3. Final Answer:

    Missing comma after the second arm (2 => ...). -> Option C
  4. Quick Check:

    Commas separate match arms [OK]
Hint: Check commas after each match arm carefully [OK]
Common Mistakes:
  • Forgetting commas between arms
  • Misunderstanding _ as invalid
  • Confusing braces with parentheses
5. Given a list of Option<i32> values, how can you use a match expression inside a loop to print only the positive numbers, ignoring None and non-positive values? Choose the correct code snippet.
hard
A. for val in list { match val { Some(n) if n > 0 => println!("Positive: {}", n), _ => (), } }
B. for val in list { match val { Some(n) => println!("Positive: {}", n), None => println!("No value"), } }
C. for val in list { if let Some(n) = val { if n > 0 { println!("Positive: {}", n); } } }
D. for val in list { match val { Some(n) if n <= 0 => println!("Positive: {}", n), _ => (), } }

Solution

  1. Step 1: Understand the requirement

    We want to print only positive numbers inside Some, ignoring None and non-positive.
  2. Step 2: Analyze each option

    for val in list { match val { Some(n) if n > 0 => println!("Positive: {}", n), _ => (), } } matches Some(n) with guard n > 0 and prints; others ignore with _ => (). for val in list { match val { Some(n) => println!("Positive: {}", n), None => println!("No value"), } } prints all Some values regardless of positivity. for val in list { if let Some(n) = val { if n > 0 { println!("Positive: {}", n); } } } uses if let but is not a match expression. for val in list { match val { Some(n) if n <= 0 => println!("Positive: {}", n), _ => (), } } prints non-positive numbers, opposite of requirement.
  3. Final Answer:

    for val in list { match val { Some(n) if n > 0 => println!("Positive: {}", n), _ => (), } } -> Option A
  4. Quick Check:

    Match with guard filters positive Some values [OK]
Hint: Use if guards in match to filter values [OK]
Common Mistakes:
  • Printing all Some values without checking positivity
  • Using if let instead of match when asked
  • Reversing guard condition
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