Использование '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, он извлекает информацию об ошибке и выполняет вторую ветку. Этот паттерн гарантирует, что вы никогда случайно не проигнорируете потенциальную ошибку.
Задание
ЛегкоВы получите два входных значения. Первое значение — это число (в виде строки), а второе значение — другое число (в виде строки). Создайте функцию, которая пытается разделить первое число на второе и возвращает 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
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента