如何转换 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 的新手,并没有完全理解何时使用 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)
}
另请参阅:
- Lifetime of Option::map's argument
我有一个 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)
}
另请参阅:
- Lifetime of Option::map's argument