考虑一下:
loop {
let data = match something() {
Err(err) => {
warn!("An error: {}; skipped.", err);
continue;
},
Ok(x) => x
};
let data2 = match something_else() {
Err(err) => {
warn!("An error: {}; skipped.", err);
continue;
},
Ok(x) => x
};
// and so on
}
如果我不需要将 ok 值分配给 data
,我会使用 if let Err(err) = something()
,但是有没有上面代码的快捷方式可以避免在我认为典型的情况下复制粘贴 Err/Ok 分支?类似 if let
的东西也会返回 ok 值。
最佳答案
虽然我认为 E_net4 的答案可能是最好的答案,但我正在为后代添加一个宏,以防万一创建一个单独的函数并使用 ?
运算符提前返回由于某种原因是不可取的。
这是一个简单的 skip_fail!
宏,它在传递错误时继续
包含循环:
macro_rules! skip_fail {
($res:expr) => {
match $res {
Ok(val) => val,
Err(e) => {
warn!("An error: {}; skipped.", e);
continue;
}
}
};
}
这个宏可以用作let ok_value = skip_fail!(do_something());
同样,我相信在单独的函数中使用 ?
并在没有失败的情况下返回 Ok(end_result)
可能是最惯用的解决方案,所以如果您可以使用您可能应该使用的答案。
关于loops - 是否有展开或继续循环的快捷方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785136/