В 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, пользовательской вспомогательной функции и ?. оператор. Выбрав подходящий метод в зависимости от вашего конкретного варианта использования, вы сможете писать более чистый и лаконичный код.