Menu
Coddy logo textTech

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

Часть раздела Logic & Flow путешествия по 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 и вывести его на экран.

Требования:

  • Прочитайте первое входное значение (число) и удалите лишние пробелы
  • Преобразуйте (parse) первое значение в 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.

Шпаргалка

Методы .unwrap() и .expect() работают с типами Result для извлечения значений из варианта Ok.

.unwrap() извлекает значение из Ok, но вызывает панику (panic), если Result является Err:

let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Выводит: Value: 42

.expect() работает так же, но позволяет указать пользовательское сообщение об ошибке для облегчения отладки:

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

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

Эти методы следует использовать с осторожностью, так как они приведут к аварийному завершению программы, если Result окажется 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> на основе статуса
    // Используйте .expect() для извлечения значения
    // Выведите результат в формате: Value: [value]
    
}
quiz iconПроверьте себя

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

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