Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Структуры

Как и кортежи, структуры тоже можно деструктурировать через сопоставление:

// 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, и всё снова заработает.