Изучение чистых методов для достижения поведения Option::unwrap_or_else с Option<&T> в Rust

В Rust тип Optionобычно используется для обработки значений, допускающих значение NULL. Метод Option::unwrap_or_elseпозволяет нам предоставить резервную функцию или значение, если Optionравно None. Однако при работе с Option<&T>(Option, содержащим ссылку), нам необходимо правильно обрабатывать разыменование ссылки. В этой статье мы рассмотрим несколько простых методов достижения поведения Option::unwrap_or_elseс помощью Option<&T>. Давайте погрузимся!

Метод 1: использование mapи unwrap_or_else

fn get_value(option_ref: Option<&i32>, fallback: impl Fn() -> i32) -> i32 {
    option_ref.map(|&value| value).unwrap_or_else(fallback)
}

Метод 2: использование and_thenи unwrap_or_else

fn get_value(option_ref: Option<&i32>, fallback: impl Fn() -> i32) -> i32 {
    option_ref.and_then(|&value| Some(value)).unwrap_or_else(fallback)
}

Метод 3. Реализация пользовательской вспомогательной функции

fn unwrap_or_else_ref<T, F>(option_ref: Option<&T>, fallback: F) -> T
    where F: Fn() -> T
{
    match option_ref {
        Some(&value) => value,
        None => fallback(),
    }
}
// Usage:
let value = unwrap_or_else_ref(option_ref, || fallback_value);

Метод 4. Использование оператора ?

fn get_value(option_ref: Option<&i32>, fallback: impl Fn() -> i32) -> i32 {
    *option_ref? // Automatically dereference the reference
}
// Usage:
let value = get_value(option_ref, || fallback_value);

Обработка значений Option<&T>и достижение поведения Option::unwrap_or_elseтребуют тщательного рассмотрения разыменования. В этой статье мы рассмотрели четыре простых метода достижения этой цели в Rust, включая использование map, and_then, пользовательской вспомогательной функции и ?. оператор. Выбрав подходящий метод в зависимости от вашего конкретного варианта использования, вы сможете писать более чистый и лаконичный код.