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

Перечисления

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

Шаблоны также можно использовать, чтобы связать переменные с частями значений. Так вы исследуете структуру своих типов. Начнём с простого типа enum:

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

enum Result {
    Ok(i32),
    Err(String),
}

fn divide_in_two(n: i32) -> Result {
    if n % 2 == 0 {
        Result::Ok(n / 2)
    } else {
        Result::Err(format!("cannot divide {n} into two equal parts"))
    }
}

fn main() {
    let n = 100;
    match divide_in_two(n) {
        Result::Ok(half) => println!("{n} divided in two is {half}"),
        Result::Err(msg) => println!("sorry, an error happened: {msg}"),
    }
}

Здесь мы использовали ветки, чтобы деструктурировать значение Result. В первой ветке half связывается со значением внутри варианта Ok. Во второй ветке msg связывается с сообщением об ошибке.

This slide should take about 4 minutes.
  • Выражение if/else возвращает перечисление, которое затем распаковывается с помощью match.
  • Можно попробовать добавить третий вариант в определение перечисления и вывести ошибки при запуске кода. Укажите места, где код теперь не исчерпывающий, и как компилятор пытается подсказать решение.
  • Значения в вариантах перечисления можно получить только после сопоставления с образцом.
  • Покажите, что происходит, если поиск не исчерпывающий. Обратите внимание на преимущество компилятора Rust: он подтверждает, что все случаи обработаны.
  • Покажите синтаксис варианта в стиле структуры, добавив такой вариант в определение перечисления и в match. Укажите, что это синтаксически похоже на сопоставление со структурой.