模式匹配是一种结构性的解构。类似这样:

struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p = Point { x: 0, y: 7 };

    let Point { x: a, y: b } = p;
    assert_eq!(0, a);
    assert_eq!(7, b);
}

这里的 Point { x: a, y: b } 就是模式匹配。

Refutable vs irrefutable

当一个模式有可能不与它所匹配的值匹配时,我们就说该模式是可反驳的。另一方面,无可辩驳的模式总是与它们所匹配的值相匹配。例如:

let (x, y) = (1, 2); // irrefutable pattern

if let (a, 3) = (1, 2) { // refutable pattern
    panic!("Shouldn't reach here");
} else if let (a, 4) = (3, 4) {
    println!("Matched ({}, 4)", a);
}