![](/img/trans.png)
[英]How can I pattern-match a Vec<T> inside an enum field without nesting matches?
[英]Composing Option<Enum> with closures that pattern-match arguments
我有一个带有两个可能的“类型”的枚举和一个可能返回其中任何一个的函数,并包装在Option
:
enum Possibilities {
First(i32),
Second(String),
}
use Possibilities::*;
fn some_poss() -> Option<Possibilities> {
Some(Second(String::from("hi")))
}
我想对some_poss
的结果应用操作,但是此操作仅对枚举的一种可能有意义,否则应返回None
。 例如:
let a: Option<i32> = some_poss().and_then(|poss| if let First(x) = poss {
Some(x * 2)
} else {
None
});
如何简洁地结合此操作? 是否可以使用类似于以下内容的方式编写此代码?
// Compile error: pattern `Second(_)` not covered
let b: Option<i32> = some_poss().map(|First(x)| x * 2);
处理此特定情况的最佳方法是在enum
上创建一种方法专门用于检索一个变体。 有点像Result::ok
。
enum Possibilities {
First(i32),
Second(String),
}
use Possibilities::*;
impl Possibilities {
fn first(self) -> Option<i32> {
match self {
Possibilities::First(x) => Some(x),
_ => None,
}
}
}
这将使您可以像以下方式实现功能:
some_fun().and_then(|p| p.first()).map(|x| x * 2)
// or, if you prefer this style:
some_fun().and_then(Possibilities::first).map(|x| x * 2);
这样可以明确每个步骤在做什么some_poss
获取Option<Possiblities>
some_poss
Option<Possiblities>
,然后first()
从该Possibilities
获取Option<i32>
,然后and_then
Option<Option<i32>>
折叠为Option<i32>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.