Перелічувані типи

Як і кортежі, переліки також можуть бути деструктуровані шляхом зіставлення:

Шаблони також можна використовувати для прив’язки змінних до частин ваших значень. Таким чином ви перевіряєте структуру ваших типів. Давайте розпочнемо з простого типу enum:

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!("не можна поділити {n} на дві рівні частини"))
    }
}

fn main() {
    let n = 100;
    match divide_in_two(n) {
        Result::Ok(half) => println!("{n} поділена навпіл, це {half}"),
        Result::Err(msg) => println!("вибачте, сталася помилка: {msg}"),
    }
}

Тут ми використали гілки для деструктурування значення Result. У першій гілці half прив'язано до значення всередині варіанту Ok. У другій гілці msg прив'язано до повідомлення про помилку.

This slide should take about 4 minutes.
  • Вираз if/else повертає перелік, який пізніше розпаковується за допомогою match.
  • Ви можете спробувати додати третій варіант до визначення переліку і відобразити помилки під час виконання коду. Вкажіть місця, де ваш код зараз є невичерпним, і як компілятор намагається дати вам підказки.
  • Доступ до значень у варіантах переліку можливий лише після зіставлення з шаблоном.
  • Продемонструйте, що відбувається, коли пошук є невичерпним. Зверніть увагу на перевагу, яку надає компілятор Rust, підтверджуючи що всі випадки оброблено.
  • Збережіть результат divide_in_two у змінній result і match його у циклі. Це не буде скомпільовано, оскільки при порівнянні споживається msg. Щоб виправити це, порівняйте &result замість result. Це зробить msg посиланням, тому його не буде використано. Ця "ергономіка співставлення" з'явилася у Rust 2018. Якщо ви хочете підтримувати попередні версії Rust, замініть msg на ref msg у шаблоні.