Menu
Coddy logo textTech

Использование 'match' с 'Option'

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 36 из 66.

Теперь, когда вы понимаете, что такое Option, давайте изучим самый распространенный и явный способ работы с ним: использование выражения match. Этот подход заставляет вас рассматривать оба возможных случая — когда значение есть и когда его нет.

Выражение match прекрасно работает с Option, потому что вы можете создать ветви для обоих вариантов:

let maybe_name = Some("Alice".to_string());

match maybe_name {
    Some(name) => println!("Hello, {}!", name),
    None => println!("Hello, stranger!"),
}

Обратите внимание, как ветка Some(name) извлекает значение из варианта Some. Переменная name теперь содержит саму строку String, а не Option. Это называется деструктуризацией — вы извлекаете внутреннее значение из обертки.

Ветвь None обрабатывает случай, когда значение отсутствует, позволяя вам реализовать альтернативное поведение, например, отображение сообщения по умолчанию или выполнение совершенно другого действия.

challenge icon

Задание

Легко

Вы получите имя студента в качестве входных данных. Имя может присутствовать в системе или отсутствовать. Создайте Option<String>, который содержит Some(name), если имя не пустое, или None, если имя пустое. Используйте выражение match для обработки обоих случаев и вывода соответствующего сообщения.

Требования:

  • Прочитайте входные данные как строку (имя студента)
  • Удалите все пробелы из входных данных с помощью .trim()
  • Создайте переменную типа Option<String>:
    • Если обрезанное имя не пустое, присвойте Some(name.to_string())
    • Если обрезанное имя пустое, присвойте None
  • Используйте выражение match для обработки обоих вариантов Option
  • В ветке Some(name) выведите: Welcome, [name]!
  • В ветке None выведите: No name provided

Входные данные:

  • Одна строка, содержащая либо имя студента, либо пустую строку

Выходные данные:

  • Если имя указано: Welcome, [name]!
  • Если имя не указано (пустой ввод): No name provided

Шпаргалка

Используйте выражение match для обработки значений Option, создавая ветки для обоих вариантов:

let maybe_name = Some("Alice".to_string());

match maybe_name {
    Some(name) => println!("Hello, {}!", name),
    None => println!("Hello, stranger!"),
}

Ветка Some(name) использует деструктуризацию для извлечения внутреннего значения из варианта Some. Переменная name содержит само значение, а не обертку Option.

Ветка None обрабатывает случай, когда значение отсутствует, позволяя вам реализовать альтернативное поведение.

Попробуйте сами

use std::io;

fn main() {
    // Чтение ввода
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let name = input.trim();
    
    // TODO: Создать Option<String> в зависимости от того, пустое имя или нет
    
    // TODO: Использовать выражение match для обработки случаев Some и None и вывести соответствующее сообщение
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow