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 содержит значение.

Шпаргалка

Метод .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]
    
}
quiz iconПроверьте себя

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

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