Структуры
Как и кортежи, структуры тоже можно деструктурировать через сопоставление:
// 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"),
}
}
This slide should take about 4 minutes.
- Измените буквальные значения в
m, чтобы они совпали с другими шаблонами. - Добавьте новое поле в
Movementи внесите необходимые изменения в шаблон. - Обратите внимание, что
delta: (x, 0)— вложенный шаблон.
Для дальнейшего изучения
- Попробуйте
match &mи проверьте типы захватов. Синтаксис шаблона остаётся тем же, но захваты становятся разделяемыми ссылками. Это эргономика сопоставления, и она часто полезна сmatch selfпри реализации методов для перечисления.- Тот же эффект возникает с
match &mut m: захваты становятся эксклюзивными ссылками.
- Тот же эффект возникает с
- Различие между захватом и константным выражением может быть трудно заметить. Попробуйте заменить
0в первой ветке на переменную и посмотрите, что при этом незаметно перестаёт работать. Замените наconst, и всё снова заработает.