Значение по умолчанию: unwrap_or
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 40 из 66.
Хотя .unwrap() и .expect() могут извлекать значения из Option, у них обоих есть существенный недостаток: они вызывают панику при обнаружении None. Для более безопасного кода Rust предоставляет .unwrap_or() — метод, который никогда не вызывает панику.
Метод .unwrap_or() принимает значение по умолчанию в качестве аргумента. Если Option содержит Some, он возвращает внутреннее значение. Если это None, он возвращает предоставленное вами значение по умолчанию:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // Выводит: Score: 85
let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // Выводит: Score: 0Этот подход гораздо безопаснее, чем .unwrap(), потому что ваша программа никогда не завершится аварийно — вы всегда получаете полезное значение.
Задание
ЛегкоВы получите два входных значения. Первое значение — это количество баллов (число), а второе значение указывает, доступны ли баллы (yes) или они отсутствуют (no). Создайте Option<i32> на основе статуса доступности. Используйте .unwrap_or(), чтобы безопасно извлечь баллы со значением по умолчанию 50, а затем выведите итоговый результат.
Требования:
- Прочитайте первое входное значение (баллы) и удалите лишние пробелы
- Преобразуйте первое входное значение в тип
i32 - Прочитайте второе входное значение (статус доступности) и удалите лишние пробелы
- Создайте переменную типа
Option<i32>:- Если статус доступности равен
yes, присвойтеSome(score) - Если статус доступности равен
no, присвойтеNone
- Если статус доступности равен
- Используйте
.unwrap_or(50), чтобы извлечь баллы со значением по умолчанию50 - Выведите итоговый результат в формате:
Final score: [score]
Ввод:
- Первая строка: Число, представляющее баллы (например,
85) - Вторая строка: Либо
yes, либоno
Вывод:
- Если статус доступности
yes:Final score: [score](фактическое количество баллов) - Если статус доступности
no:Final score: 50(значение по умолчанию)
Шпаргалка
Метод .unwrap_or() предоставляет безопасный способ извлечения значений из Option без вызова паники. Он принимает значение по умолчанию в качестве аргумента и возвращает либо внутреннее значение, если это Some, либо значение по умолчанию, если это None:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score равен 85
let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score равен 0Этот метод безопаснее, чем .unwrap() или .expect(), потому что он никогда не вызывает панику — вы всегда получаете пригодное для использования значение.
Попробуйте сами
use std::io;
fn main() {
// Считать количество баллов
let mut score_input = String::new();
io::stdin().read_line(&mut score_input).expect("Failed to read line");
let score: i32 = score_input.trim().parse().expect("Invalid number");
// Считать статус доступности
let mut availability = String::new();
io::stdin().read_line(&mut availability).expect("Failed to read line");
let availability = availability.trim();
// TODO: Напишите ваш код ниже
// Создать Option<i32> на основе статуса доступности
// Использовать .unwrap_or(50), чтобы получить итоговый балл
// Вывести результат
println!("Final score: {}", final_score);
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента