Menu
Coddy logo textTech

Распаковка '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().

challenge icon

Задание

Легко

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

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

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