Result
Result похож на Option, но указывает на успех или неудачу операции, каждое из которых представлено разным вариантом перечисления. Он обобщённый: Result<T, E>, где T используется в варианте Ok, а E появляется в варианте Err.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
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!("Dear diary: {contents} ({bytes} bytes)");
} else {
println!("Could not read file content");
}
}
Err(err) => {
println!("The diary could not be opened: {err}");
}
}
}
This slide should take about 5 minutes.
- Как и с
Option, успешное значение находится внутриResult, и разработчик вынужден явно его извлечь. Это поощряет проверку ошибок. Если ошибка не должна случиться никогда, можно вызватьunwrap()илиexpect(), и это тоже сигнализирует о намерении разработчика. - Документацию
Resultрекомендуется прочитать. Не во время курса, но стоит упомянуть. Там много удобных методов и функций, которые помогают функциональному стилю программирования. Result— стандартный тип для реализации обработки ошибок, как мы увидим в четвёртый день.