首页 > 解决方案 > 如何转换选项中的内部值?

问题描述

我有一个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 吗?这对我来说似乎相当冗长,并且看起来像一个到处都会出现的模式,所以我可以想象这可以更简洁地处理;是这样吗?

标签: rustoptionalrust-2018

解决方案


使用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)
}

也可以看看:


推荐阅读