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