Метод expect
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 39 из 66.
Хотя .unwrap() справляется со своей задачей, у него есть существенный недостаток: когда он вызывает панику на None, сообщение об ошибке получается общим и малоинформативным. Именно здесь .expect() приходит на помощь.
Метод .expect() работает точно так же, как .unwrap() — он извлекает значение из Some и вызывает панику в случае None. Ключевое отличие заключается в том, что .expect() позволяет указать собственное сообщение об ошибке при панике:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Если Option содержит Some, .expect() возвращает внутреннее значение, точно так же как и .unwrap(). Но если это None, вместо стандартного сообщения о панике вы увидите своё собственное сообщение, что значительно упрощает понимание того, что и где пошло не так.
Задание
ЛегкоВы получите два входных значения. Первое значение — это название продукта, а второе указывает, есть ли продукт в наличии (yes) или его нет (no). Создайте Option<String>, который содержит Some(product_name), если продукт есть в наличии, или None, если его нет. Используйте .expect() с описательным сообщением, чтобы извлечь название продукта и вывести его на экран.
Требования:
- Прочитайте первое входное значение (название продукта) и удалите лишние пробелы
- Прочитайте второе входное значение (статус наличия) и удалите лишние пробелы
- Создайте переменную типа
Option<String>:- Если статус наличия равен
yes, присвойтеSome(product_name.to_string()) - Если статус наличия равен
no, присвойтеNone
- Если статус наличия равен
- Используйте
.expect()с сообщением"Product should be in stock"для извлечения названия продукта - Выведите извлеченное название продукта в формате:
Product available: [product_name]
Ввод:
- Первая строка: Название продукта (например,
Laptop) - Вторая строка: Либо
yes, либоno
Вывод:
- Если статус наличия
yes:Product available: [product_name] - Если статус наличия
no: Программа завершится с ошибкой (panic) и пользовательским сообщением "Product should be in stock" (это ожидаемое поведение для данного задания)
Примечание: Когда статус наличия равен no, вызов .expect() для None вызовет панику с вашим пользовательским сообщением. Это демонстрирует, как .expect() предоставляет более полезную информацию об ошибке по сравнению с .unwrap().
Шпаргалка
Метод .expect() работает аналогично .unwrap(), но позволяет указать пользовательское сообщение о панике для более удобной отладки ошибок.
При вызове для Option:
- Если он содержит
Some, возвращается внутреннее значение - Если он содержит
None, происходит паника с вашим пользовательским сообщением
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Пользовательское сообщение об ошибке упрощает идентификацию того, что пошло не так и в каком месте вашего кода.
Попробуйте сами
use std::io;
fn main() {
// Прочитать название продукта
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// Прочитать статус наличия
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: Напишите свой код ниже
// Создайте Option<String> на основе stock_status
// Используйте .expect() для извлечения названия продукта
// Выведите результат в формате: Product available: [product_name]
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента