Skip to content

Pattern matching in Rust

Rust language also supports [[pattern matching]].

Match

   match is_tuesday {
        true => println!("Using purple as background color"),
        false => println!("Using orange as background color"),
        _ => println!("Using black as background color")
    };

    match x {
        1|2 => println!("hey!"),
        3...5 => println!("hey?"),
        _ => println!("bye ... ")
    }

If let

if let Some(color) = favorite_color {
        println!("Using your favorite color {}", favorite_color)
    } else if is_tuesday {
        println!("Tuesday is green day");
    } else if let Ok(age) = age {
        if age > 30 {
            println!("Using purple as background color");
        } else {
            println!("Using orange as background color");
        }
    } else {
        println!("Using blue as background color");
    }

While let and for let patterns


 let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);

while let Some(top) = stack.pop() {
    println!("{}", top);
}

The [[loop]] stops when the pop returns None.

For let

let v = vec!["a", "b", "c"];
for (index, value) in v.iter().enumerate() {
    println!("{} is at index {}", value, index)
}

Assignment

let (x, y, z) = (1,2,3);
println("{} {} {}", x,y,z);

Refutable and irrefutable patterns

[[Patterns]] that will match for any value are called [[Refutable]], patterns that can fail for some values are called [[Irrefutable]].

Ref and Ref mut

let name = Some(String::from("Bob"))    ;

match name {
    Some(ref name) => println!("Found name {}", name),
    None => (),
}

println!("{:?}", name);

Output:

` davis@davis-arch  ~/projects/rust   master  ./42-pattern-matching Using orange as background color Using purple as background color 3 2 1 a is at index 0 b is at index 1 c is at index 2 1 2 3 hey! Some("John")