Распаковка 'Option'
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 38 из 66.
Иногда вам нужно извлечь фактическое значение из Option, когда вы уверены, что оно содержит Some. Rust предоставляет метод .unwrap() для этой цели — он извлекает значение из Some и передает его вам напрямую.
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);Когда вы вызываете .unwrap() у Some(value), он возвращает внутреннее значение. В примере выше actual_number становится 42 — больше не обернутым в Option.
Однако, есть важное предупреждение: если вы вызовете .unwrap() для None, ваша программа запаникует и немедленно завершится с ошибкой. Это делает .unwrap() потенциально опасным методом, который следует использовать только тогда, когда вы абсолютно уверены, что Option содержит Some.
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Это вызовет панику!Используйте .unwrap() с осторожностью и только в тех ситуациях, когда вы можете гарантировать, что Option содержит значение, например, в простых примерах или когда вы уже выполнили проверку с помощью .is_some().
Задание
ЛегкоВы получите два входных значения. Первое значение — это число (в виде строки), а второе значение указывает, следует ли считать это число допустимым или недопустимым. Если второе значение равно valid, создайте Option<i32>, содержащий Some с распарсенным числом. Если второе значение равно invalid, создайте Option<i32>, содержащий None. Используйте .unwrap(), чтобы извлечь значение из Option и вывести его на экран.
Требования:
- Прочитайте первое входное значение и удалите лишние пробелы
- Прочитайте второе входное значение и удалите лишние пробелы
- Преобразуйте первое входное значение в
i32, используя.parse::<i32>() - Создайте переменную типа
Option<i32>:- Если второе входное значение равно
valid, присвойтеSome(parsed_number) - Если второе входное значение равно
invalid, присвойтеNone
- Если второе входное значение равно
- Используйте
.unwrap()для извлечения значения изOption - Выведите извлеченное значение в формате:
Value: [number]
Ввод:
- Первая строка: Число в виде строки (например,
42) - Вторая строка: Либо
valid, либоinvalid
Вывод:
- Если второе входное значение равно
valid:Value: [number] - Если второе входное значение равно
invalid: Программа завершится с ошибкой (panic) (это ожидаемое поведение для данного задания)
Примечание: Если второе входное значение равно invalid, вызов .unwrap() для None вызовет панику (panic). Это демонстрирует опасную природу .unwrap(), когда вы не уверены, что Option содержит значение.
Шпаргалка
Метод .unwrap() извлекает значение из Option<T>:
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // Выводит: The number is: 42Внимание: Вызов .unwrap() для None приведет к панике и аварийному завершению программы:
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Это вызовет панику!Используйте .unwrap() только тогда, когда вы абсолютно уверены, что Option содержит значение Some.
Попробуйте сами
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();
// Читаем второй ввод (valid или invalid)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// Парсим число
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO: Напишите ваш код ниже
// Создайте Option<i32> на основе validity_input
// Если validity_input равен "valid", присвойте Some(parsed_number)
// Если validity_input равен "invalid", присвойте None
// Затем используйте .unwrap(), чтобы извлечь значение и напечатать его в формате: Value: [number]
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента