← Back to Rust Course | Chapter 8: Enums & Pattern Matching | Lesson 1 of 7

Enum Basics

An enum lets a value be exactly one of several named choices you define ahead of time.

Defining a Simple Enum

An enum defines a type whose value can be exactly one of a fixed set of named variants, useful for representing a closed set of possibilities.

Example: Defining a Simple Enum

markup
#[derive(Debug)]
enum Direction {
    North,
    South,
    East,
    West,
}

fn main() {
    let heading = Direction::North;
    println!("{:?}", heading);
}

Enums With Data

Unlike simple labels, Rust enum variants can carry their own associated data, and different variants can carry different types and amounts of data.

Example: Enums With Data

markup
#[derive(Debug)]
enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn main() {
    let shapes = [Shape::Circle(2.0), Shape::Rectangle(3.0, 4.0)];
    for s in shapes.iter() {
        println!("{:?}", s);
    }
}

Matching on an Enum

match is the primary way to inspect which variant an enum value holds and to extract any data it carries, with a separate arm for each possible variant.

Example: Matching on an Enum

markup
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn main() {
    let light = TrafficLight::Yellow;
    match light {
        TrafficLight::Red => println!("Stop"),
        TrafficLight::Yellow => println!("Slow down"),
        TrafficLight::Green => println!("Go"),
    }
}

Comparing Enum Values

Deriving PartialEq on an enum allows comparing its values directly with ==, which is useful for simple checks without writing a full match.

Example: Comparing Enum Values

markup
#[derive(PartialEq, Debug)]
enum Status {
    Active,
    Inactive,
}

fn main() {
    let current = Status::Active;
    println!("Is active: {}", current == Status::Active);
}
Common Mistakes
  1. Forgetting an enum variant can carry its own data, not just be a plain label like in some other languages.
  2. Trying to compare enum variants with == before deriving PartialEq on the enum.
  3. Assuming enum variant names are globally unique -- they must be qualified with EnumName::Variant unless imported.
Chapter Summary
  • An enum defines a type that can be exactly one of several named variants.
  • Variants can optionally carry associated data, including different data per variant.
  • Enum values are typically handled with match to branch on which variant is present.
  • Deriving traits like Debug and PartialEq on an enum enables printing and comparison.
🔒

Chapter Quiz — Complete all 7 topics to unlock

0/7 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.