Menu
Coddy logo textTech

Метод 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, вместо стандартного сообщения о панике вы увидите своё собственное сообщение, что значительно упрощает понимание того, что и где пошло не так.

challenge icon

Задание

Легко

Вы получите два входных значения. Первое значение — это название продукта, а второе указывает, есть ли продукт в наличии (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]
    
}
quiz iconПроверьте себя

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

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