Метод ok_or_else
Метод ok_or_else преобразует значение типа
Option<T> в значение типа
Result<T, E>. Если вариант содержит
Some, метод возвращает
Ok с внутренним значением. Если вариант
содержит None, метод вызывает переданную
функцию-замыкание и возвращает Err с её
результатом. Параметром метод принимает замыкание,
которое не получает аргументов и возвращает значение
ошибки.
Метод ok_or_else удобен тем, что значение
ошибки вычисляется лениво - только в случае
None. Это отличает его от метода
ok_or, который принимает уже готовое
значение ошибки.
Синтаксис
Option::ok_or_else(self, err: F) -> Result<T, E>
where F: FnOnce() -> E
Пример
Давайте преобразуем вариант Some в
Result при помощи метода
ok_or_else:
fn main()
{
let opt: Option<i32> = Some(5);
let res = opt.ok_or_else(|| "value is missing");
println!("{:?}", res);
}
Результат выполнения кода:
Ok(5)
Пример
Теперь преобразуем вариант None в
Result при помощи метода
ok_or_else:
fn main()
{
let opt: Option<i32> = None;
let res = opt.ok_or_else(|| "value is missing");
println!("{:?}", res);
}
Результат выполнения кода:
Err("value is missing")
Пример
Метод ok_or_else позволяет вычислить
значение ошибки лениво. Давайте убедимся, что
замыкание не вызывается, когда вариант содержит
Some:
fn main()
{
let opt: Option<&str> = Some("abcde");
let res = opt.ok_or_else(|| {
println!("closure called");
"empty"
});
println!("{:?}", res);
}
Результат выполнения кода:
Ok("abcde")
Пример
Если же вариант содержит None,
замыкание будет вызвано, и его побочные эффекты
выполнятся:
fn main()
{
let opt: Option<&str> = None;
let res = opt.ok_or_else(|| {
println!("closure called");
"empty"
});
println!("{:?}", res);
}
Результат выполнения кода:
closure called
Err("empty")