Result

Result подібний до Option, але вказує на успіх або невдачу операції, кожен з яких має свій тип. Він подібний до Res, визначеного у вправі з виразами, але є узагальненим: Result<T, E>, де T використовується у варіанті Ok, а E з'являється у варіанті Err.

use std::fs::File;
use std::io::Read;

fn main() {
    let file: Result<File, std::io::Error> = File::open("diary.txt");
    match file {
        Ok(mut file) => {
            let mut contents = String::new();
            if let Ok(bytes) = file.read_to_string(&mut contents) {
                println!("Дорогий щоденник: {contents} ({bytes} байтів)");
            } else {
                println!("Не вдалося прочитати вміст файлу");
            }
        }
        Err(err) => {
            println!("Щоденник не вдалося відкрити: {err}");
        }
    }
}
This slide should take about 5 minutes.
  • Як і у випадку з Option, успішне значення знаходиться всередині Result, змушуючи розробника явно витягти його. Це стимулює перевірку помилок. У випадку, коли помилка взагалі не очикуєтся, можна викликати unwrap() або expect(), і це також є сигналом про наміри розробника.
  • Порекомендуйте прочитати Result документацію. Не під час курсу, але варто згадати. Вона містить багато зручних методів і функцій, які допомагають програмувати у функціональному стилі.
  • Result — це стандартний тип для реалізації обробки помилок, як ми побачимо у 4-му дні.