21.17 Patterns in for Loops and Function Parameters

Rust extends pattern matching beyond match:

21.17.1 for Loops

You can destructure values right in the loop header:

fn main() {
    let data = vec!["apple", "banana", "cherry"];
    for (index, fruit) in data.iter().enumerate() {
        println!("{}: {}", index, fruit);
    }
}

The (index, fruit) pattern directly unpacks (usize, &str) from .enumerate().

21.17.2 Function Parameters

Patterns can also appear in function or closure parameters:

fn sum_pair((a, b): (i32, i32)) -> i32 {
    a + b
}

fn main() {
    println!("{}", sum_pair((4, 5)));
}

Ignoring unused parameters is trivial:

#![allow(unused)]
fn main() {
fn do_nothing(_: i32) {
    // The parameter is ignored
}
}

Closures work similarly, letting you destructure arguments right in the closure’s parameter list.