РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
586 of 1245 menu

Метод 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")

Смотрите также

  • метод ok_or,
    который преобразует Option в Result с готовым значением ошибки
  • метод unwrap,
    который извлекает значение из Some или паникует
  • метод is_some,
    который проверяет, содержит ли Option значение
  • метод is_none,
    который проверяет, содержит ли Option значение None
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить