Option & Unwrap

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы узнаем о перечислении Option из стандартной библиотеки Rust (std), которое используется для обработки случаев, когда отсутствие значения является возможным. Он предоставляет два варианта: Some(T) для случая, когда найден элемент типа T, и None для случая, когда элемент не найден. Эти случаи можно обрабатывать явно с использованием match, или неявно с использованием unwrap. Явная обработка позволяет более тщательно контролировать процесс и получать осмысленный вывод, в то время как unwrap может либо вернуть внутренний элемент, либо вызвать панику.

Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Option и unwrap

В предыдущем примере мы показали, что можем вызвать сбой программы по своему желанию. Мы сказали нашей программе вызывать panic, если мы пьем сладкий лимонад. Но что если мы ожидаем какой-то напиток, но его не получаем? Этот случай будет также плохим, поэтому его нужно обработать!

Мы могли бы проверить это на пустую строку (""), как мы это делаем с лимонадом. Поскольку мы используем Rust, давайте вместо этого попросим компилятор показать случаи, когда нет напитка.

Перечисление (enum), называемое Option<T> в стандартной библиотеке (std), используется, когда отсутствие значения является возможным. Он проявляется в виде одного из двух "вариантов":

  • Some(T): Найден элемент типа T
  • None: Элемент не найден

Эти случаи можно обрабатывать либо явно с использованием match, либо неявно с использованием unwrap. Неявная обработка либо вернет внутренний элемент, либо вызовет panic.

Обратите внимание, что можно вручную настроить panic с использованием expect, но unwrap в противном случае даст нам менее осмысленный вывод, чем явная обработка. В следующем примере явная обработка дает более контролируемый результат, при этом остается возможность вызвать panic, если это необходимо.

// Взрослый человек уже видел все и может хорошо справляться с любым напитком.
// Все напитки обрабатываются явно с использованием `match`.
fn give_adult(drink: Option<&str>) {
    // Укажите последовательность действий для каждого случая.
    match drink {
        Some("lemonade") => println!("Ёк! Слишком сладко."),
        Some(inner)   => println!("{}? Как приятно.", inner),
        None          => println!("Нет напитка? Ну ладно."),
    }
}

// Другие будут вызывать `panic`, прежде чем пить сладкие напитки.
// Все напитки обрабатываются неявно с использованием `unwrap`.
fn drink(drink: Option<&str>) {
    // `unwrap` вызывает `panic`, когда получает `None`.
    let inside = drink.unwrap();
    if inside == "lemonade" { panic!("AAAaaaaa!!!!"); }

    println!("Я люблю {}s!!!!!", inside);
}

fn main() {
    let water  = Some("water");
    let lemonade = Some("lemonade");
    let void  = None;

    give_adult(water);
    give_adult(lemonade);
    give_adult(void);

    let coffee = Some("coffee");
    let nothing = None;

    drink(coffee);
    drink(nothing);
}

Резюме

Поздравляем! Вы завершили лабу по Option и Unwrap. Вы можете практиковаться в других лабах в LabEx, чтобы улучшить свои навыки.