Перечисления
Как и кортежи, перечисления тоже можно деструктурировать через сопоставление:
Шаблоны также можно использовать, чтобы связать переменные с частями значений. Так вы исследуете структуру своих типов. Начнём с простого типа 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. Укажите, что это синтаксически похоже на сопоставление со структурой.