如何转换期权中的内值?

问题描述 投票:-1回答:1

我有一个 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吗?在我看来相当啰嗦,看起来就像一个会出现在所有地方的模式,所以我可以想象这可以处理得更简洁;是这样吗?

rust optional
1个回答
5
投票

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

另见

© www.soinside.com 2019 - 2024. All rights reserved.