如何转换 Option 中的内在值?

How to convert the inner value in an 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 的新手,并没有完全理解何时使用 matchif let 或何时使用 ? 运算符的复杂性。

我的实现是惯用的 Rust 吗?这对我来说似乎相当冗长,并且看起来像一种会出现在所有地方的模式,所以我可以想象这可以更简洁地处理;是这样吗?

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

另请参阅:

  • Lifetime of Option::map's argument