lotsoftools

Understanding Rust Error E0004: Non-Exhaustive Patterns

Rust Error E0004 Explained

In Rust, when using the `match` expression, it is critical to ensure that all possible input patterns are handled. Error E0004 occurs when the compiler detects a `match` expression with non-exhaustive patterns, meaning that at least one possible input pattern is not covered.

Example of E0004

Consider the following example of a Rust code:

#![allow(unused)]
fn main() {
enum Terminator {
    HastaLaVistaBaby,
    TalkToMyHand,
}

let x = Terminator::HastaLaVistaBaby;

match x {
    Terminator::TalkToMyHand => {}
}
}

In this code, we have an enum `Terminator` with two variants, `HastaLaVistaBaby` and `TalkToMyHand`. The `match` expression only covers the `TalkToMyHand` pattern, resulting in error E0004 because `HastaLaVistaBaby` is not covered.

Handling Exhaustive Patterns

To fix the E0004 error, we must ensure that the `match` expression has exhaustive patterns, covering all possible input values. For enums with a small number of variants, it's good practice to explicitly handle each case. Alternatively, you can use the underscore (_) wildcard pattern to match any other input after handling all known cases.

Example of Exhaustive Patterns

Here are two methods to fix the E0004 error in the example code:

// Method 1: Explicitly handle each case
match x {
    Terminator::TalkToMyHand => {}
    Terminator::HastaLaVistaBaby => {}
}

// Method 2: Use the wildcard pattern
match x {
    Terminator::TalkToMyHand => {}
    _ => {}
}

By using either of the above methods, the `match` expression now accounts for all possible input values, resolving error E0004.

Recommended Reading