Распаковка '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 содержит значение.
Попробуйте сами
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Итоги: поиск элемента