Error handling 是否有基于布尔条件返回结果的组合符?
对于选项类型,我经常使用Error handling 是否有基于布尔条件返回结果的组合符?,error-handling,rust,boolean,Error Handling,Rust,Boolean,对于选项类型,我经常使用ok\u或combinator返回如下错误: let my_vec = [1,2,3]; let head = my_vec.first().cloned().ok_or(Error::MyError)?; use std::ops::Not; my_vec.is_empty().not().then(|| ()).ok_or(MyError) 我正在寻找一个类似的组合器或方法来处理布尔值,而不是选项类型。例如: let my_vec = [1,2,3]; let
ok\u或
combinator返回如下错误:
let my_vec = [1,2,3];
let head = my_vec.first().cloned().ok_or(Error::MyError)?;
use std::ops::Not;
my_vec.is_empty().not().then(|| ()).ok_or(MyError)
我正在寻找一个类似的组合器或方法来处理布尔值,而不是选项类型。例如:
let my_vec = [1,2,3];
let head = my_vec.is_empty().false_or(Error::MyError)?;
我经常编写匹配来处理此问题,但它似乎非常冗长:
let vec_is_ok = match my_vec.is_empty() {
true => Err(...),
false => Ok(())
}
vec_is_ok?;
有没有更简洁的方法来编写类似于我可以在布尔值上使用的
ok\u或组合器的代码?有一种方法bool::then
(在Rust 1.50.0中添加),返回一个选项
,可以将其转换为结果
您的示例如下所示:
let my_vec = [1,2,3];
let head = my_vec.first().cloned().ok_or(Error::MyError)?;
use std::ops::Not;
my_vec.is_empty().not().then(|| ()).ok_or(MyError)
我经常编写匹配来处理此问题,但它似乎非常冗长:
let vec_is_ok = match my_vec.is_empty() {
true => Err(...),
false => Ok(())
}
vec_is_ok?;
let vec_is_ok=匹配my_vec.is_empty(){
true=>Err(…),
false=>Ok(())
}
vec_还好吗?;
如果
是一个表达式并与布尔值一起使用:
let vec_is_ok=if my_vec.is_empty(){Err(…)}else{ok(())};
Peter Hall主张的另一种选择是更旧但更丰富的板条箱,它提供
let vec_is_ok=my_vec.is_empty.not().as_result((),…);
或
let vec_is_ok=my_vec.is_empty.not().ok_或(…)
后者基本上与前一种特殊情况相同,即Ok(())
的“成功”情况是常见的
如果一个(或两个)有效负载需要昂贵的设置,则来自
的
还有两个回调。可能会有所帮助。