Menu
Coddy logo textTech

Значение по умолчанию: 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(), потому что ваша программа никогда не завершится аварийно — вы всегда получаете полезное значение.

challenge icon

Задание

Легко

Вы получите два входных значения. Первое значение — это количество баллов (число), а второе значение указывает, доступны ли баллы (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);
}
quiz iconПроверьте себя

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

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