構造体
タプルと同様に、構造体もマッチングによって分解できます。
// 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に変えると、再び動くことを確認してください。