Сокращения: 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!"); // Паника!Хотя эти методы обеспечивают быстрый доступ к успешным значениям, их следует использовать с осторожностью. Они наиболее уместны, когда вы абсолютно уверены, что операция завершится успешно, или во время разработки и тестирования.
Задание
ЛегкоВы получите два входных значения. Первое значение — это число (в виде строки), а второе — индикатор статуса (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]
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента