结构体

Like tuples, Struct can also be destructured by matching:

struct Foo {
    x: (u32, u32),
    y: u32,
}

#[rustfmt::skip]
fn main() {
    let foo = Foo { x: (1, 2), y: 3 };
    match foo {
        Foo { y: 2, x: i }   => println!("y = 2, x = {i:?}"),
        Foo { x: (1, b), y } => println!("x.0 = 1, b = {b}, y = {y}"),
        Foo { y, .. }        => println!("y = {y}, other fields were ignored"),
    }
}
This slide should take about 4 minutes.
  • 更改“foo”中的字面量值以与其他模式相匹配。
  • 向“Foo”添加一个新字段,并根据需要更改模式。

探索更多

  • Try match &foo and check the type of captures. The pattern syntax remains the same, but the captures become shared references. This is match ergonomics and is often useful with match self when implementing methods on an enum.
    • The same effect occurs with match &mut foo: the captures become exclusive references.
  • The distinction between a capture and a constant expression can be hard to spot. Try changing the 2 in the first arm to a variable, and see that it subtly doesn’t work. Change it to a const and see it working again.