Как преобразовать внутреннее значение в 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)
}

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

Другие вопросы по тегам