Как преобразовать внутреннее значение в Option?
У меня есть Option
который содержит JSON. Если этоSome
, внутренний JSON должен быть преобразован, но если он None
, он должен оставаться None
.
Вот как я это реализовал сейчас:
struct One;
struct Other;
impl One {
pub fn convert(&self) -> Other {
Other {}
}
}
fn example(attr: Option<One>) -> Option<Other> {
match attr {
Some(attr) => Some(attr.convert()),
None => None,
}
}
Я новичок в Rust и не совсем понимаю, когда использовать match
, if let
или когда использовать ?
оператор.
Является ли моя реализация идиоматической Rust? Мне это кажется довольно многословным и похоже на шаблон, который будет встречаться повсюду, поэтому я могу представить, что с этим можно справиться гораздо более кратко; это так?
1 ответ
Решение
Использовать Option::map
:
fn example_a(attr: Option<One>) -> Option<Other> {
attr.map(|v| v.convert())
}
Поскольку ваша функция принимает ссылку, вы также можете использовать Option::as_ref
а затем напрямую использовать функцию внутри map
вместо закрытия:
fn example_b(attr: Option<One>) -> Option<Other> {
attr.as_ref().map(One::convert)
}
Смотрите также:
- Преобразование из Option
в Option<& str> - Время жизни аргумента Option:: map
- Как реализовать какие-нибудь удобные методы (например, flat_map, flatten) в Option?
- Используйте Option:: map для Box::new, объект трейта не работает
- Как наиболее идиоматично преобразовать Option<&T> в Option
в Rust? - Можно ли преобразовать Option
> в Result