如果我有多个Option<T>' 并且我想选择第一个Some而不是None- 有没有一种惯用的方法来做到这一点?
我天真的方法:
pub fn pick_first_option_available<T>(a: Option<T>, b: Option<T>, c: Option<T>) -> Option<T> {
match a {
Some(a) => Some(a),
None => match b {
Some(b) => Some(b),
None => match c {
Some(c) => Some(c),
None => None,
},
},
}
}
Run Code Online (Sandbox Code Playgroud)
上述的一个明显问题是它仅限于固定数量的选项 (3)。我宁愿有一个更一般的功能。
有一个有点相关的线程在这里,但它铲球总结采摘选项来代替。
考虑一下:
loop {
let data = match something() {
Err(err) => {
warn!("An error: {}; skipped.", err);
continue;
},
Ok(x) => x
};
let data2 = match somethingElse() {
Err(err) => {
warn!("An error: {}; skipped.", err);
continue;
},
Ok(x) => x
};
// and so on
}
Run Code Online (Sandbox Code Playgroud)
如果我不需要分配ok值data,我会使用if let Err(err) = something(),但是上面的代码是否有快捷方式,以避免复制粘贴Err/Ok分支,我认为,典型情况?像这样的东西if let也会返回ok值.