Menu
Coddy logo textTech

Использование 'match' с 'Result'

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 43 из 66.

Теперь, когда вы понимаете, что такое Result, давайте изучим самый явный и мощный способ обработки как успешных случаев, так и случаев ошибки: использование выражения match.

Так же, как и в случае с Option, match заставляет вас обрабатывать оба варианта Result. Вы создаете одну ветку для Ok для обработки успеха и другую ветку для Err для обработки ошибки:

let result = divide(10, 2);

match result {
    Ok(value) => println!("Division successful: {}", value),
    Err(error) => println!("Division failed: {}", error),
}

Когда Result равен Ok, match извлекает успешное значение и выполняет первую ветку. Когда это Err, он извлекает информацию об ошибке и выполняет вторую ветку. Этот паттерн гарантирует, что вы никогда случайно не проигнорируете потенциальную ошибку.

challenge icon

Задание

Легко

Вы получите два входных значения. Первое значение — это число (в виде строки), а второе значение — другое число (в виде строки). Создайте функцию, которая пытается разделить первое число на второе и возвращает Result<f64, &'static str>. Если второе число равно нулю, верните Err с сообщением "Division by zero". В противном случае верните Ok с результатом деления. Используйте выражение match для обработки обоих случаев Ok и Err и вывода соответствующего сообщения.

Требования:

  • Прочитайте первое входное значение (делимое) и удалите лишние пробелы
  • Преобразуйте первое значение в f64
  • Прочитайте второе входное значение (делитель) и удалите лишние пробелы
  • Преобразуйте второе значение в f64
  • Создайте функцию, которая принимает два параметра типа f64 и возвращает Result<f64, &'static str>
  • Внутри функции проверьте, равен ли делитель 0.0:
    • Если да, верните Err("Division by zero")
    • Если нет, верните Ok(dividend / divisor)
  • Вызовите функцию с двумя полученными числами
  • Используйте выражение match для обработки Result
  • В ветке Ok(value) выведите: Result: [value]
  • В ветке Err(error) выведите: Error: [error]

Ввод:

  • Первая строка: Число, представляющее делимое (например, 10.0)
  • Вторая строка: Число, представляющее делитель (например, 2.0)

Вывод:

  • Если деление успешно: Result: [result]
  • Если деление на ноль: Error: Division by zero

Шпаргалка

Используйте match для обработки вариантов Ok и Err типа Result:

let result = divide(10, 2);

match result {
    Ok(value) => println!("Division successful: {}", value),
    Err(error) => println!("Division failed: {}", error),
}

Выражение match заставляет вас обрабатывать как случаи успеха, так и ошибки. Когда Result содержит Ok, оно извлекает успешное значение и выполняет первую ветку. Когда оно содержит Err, оно извлекает информацию об ошибке и выполняет вторую ветку.

Попробуйте сами

use std::io;

// TODO: Создайте здесь вашу функцию divide, которая возвращает Result<f64, &'static str>


fn main() {
    // Чтение первого ввода (делимое)
    let mut dividend_input = String::new();
    io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
    let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
    
    // Чтение второго ввода (делитель)
    let mut divisor_input = String::new();
    io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
    let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
    
    // TODO: Вызовите вашу функцию divide и используйте match для обработки Result
    // Выведите "Result: [value]" для случая Ok
    // Выведите "Error: [error]" для случая Err
}
quiz iconПроверьте себя

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

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