構造体

タプルと同様に、構造体もマッチングによって分解できます。

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

struct Move {
    delta: (i32, i32),
    repeat: u32,
}

#[rustfmt::skip]
fn main() {
    let m = Move { delta: (10, 0), repeat: 5 };

    match m {
        Move { delta: (0, 0), .. }        => println!("Standing still"),
        Move { delta: (x, 0), repeat }    => println!("{repeat} step x: {x}"),
        Move { delta: (0, y), repeat: 1 } => println!("Single step y: {y}"),
        _                                 => println!("Other move"),
    }
}
  • m 内のリテラル値を変更して、ほかのパターンにマッチするようにしてみましょう。
  • Movement に新しいフィールドを追加し、必要に応じてパターンも変更してみましょう。
  • delta: (x, 0) がネストされたパターンであることに注目してください。

さらに試してみる

  • match &m を試して、キャプチャの型を確認してください。パターン構文自体は同じままですが、キャプチャは共有参照になります。これは match ergonomics であり、enum に対するメソッドを実装するときの match self でよく役立ちます。
    • match &mut m でも同じ効果が起こります。この場合、キャプチャは排他的参照になります。
  • キャプチャと定数式の違いは見分けにくいことがあります。最初のアームの 10 を変数に変えてみると、微妙にうまく動かないことが分かります。これを const に変えると、再び動くことを確認してください。