Использование '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 обрабатывает случай, когда значение отсутствует, позволяя вам реализовать альтернативное поведение, например, отображение сообщения по умолчанию или выполнение совершенно другого действия.
Задание
ЛегкоВы получите имя студента в качестве входных данных. Имя может присутствовать в системе или отсутствовать. Создайте 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 и вывести соответствующее сообщение
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента