Menu
CoddyTech

Сокращения: unwrap и expect

Часть раздела Логика и управление потоком путешествия по Rust на Coddy. Урок 45 из 66.

Вы уже узнали о .unwrap() и .expect() для Option; эти же методы работают и с Result. Однако при обработке успешных и неудачных случаев они ведут себя немного иначе.

Метод .unwrap() извлекает значение из варианта Ok, но если Result — это Err, ваша программа вызовет панику и завершится с ошибкой. Аналогично, .expect() делает то же самое, но позволяет указать собственное сообщение при панике, что упрощает отладку:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Выводит: Value: 42

// Это вызвало бы панику с заданным сообщением:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Вызывает панику!

Хотя эти методы обеспечивают быстрый доступ к успешно полученным значениям, использовать их следует осторожно. Они наиболее уместны, когда вы абсолютно уверены, что операция завершится успешно, или во время разработки и тестирования.

challenge icon

Задание

Легко

Вы получите два входных значения. Первое входное значение — число (в виде строки), а второе — индикатор состояния (ok или error). Создайте Result<i32, &'static str> в зависимости от состояния. Если состояние — ok, создайте Ok, содержащий разобранное число. Если состояние — error, создайте Err с сообщением "Invalid operation". Используйте .expect() с пользовательским сообщением, чтобы извлечь значение из Result и вывести его.

Требования:

  • Считайте первое входное значение (число) и удалите пробельные символы по краям
  • Преобразуйте первое входное значение в i32
  • Считайте второе входное значение (состояние) и удалите пробельные символы по краям
  • Создайте переменную типа Result<i32, &'static str>:
    • Если состояние — ok, присвойте ей Ok(parsed_number)
    • Если состояние — error, присвойте ей Err("Invalid operation")
  • Используйте .expect("Failed to get value"), чтобы извлечь значение из Result
  • Выведите извлечённое значение в формате: Value: [value]

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

  • Первая строка: число (например, 75)
  • Вторая строка: ok или error

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

  • Если состояние — ok: Value: [number]
  • Если состояние — error: программа вызовет панику с пользовательским сообщением (в этом задании это не проверяется)

Примечание: В этом задании тестовые случаи будут использовать только состояние ok, чтобы обеспечить успешное выполнение. Случай error вызовет панику — это ожидаемое поведение .expect() при получении Err.

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

use std::io;

fn main() {
    // Считайте первое входное значение (число)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Преобразуйте число в i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // Считайте второе входное значение (статус)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: Напишите свой код ниже
    // Создайте Result<i32, &'static str> на основе status
    // Используйте .expect(), чтобы извлечь значение
    // Выведите результат в формате: Value: [value]
    
}
quiz iconПроверьте себя

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Rust