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(())
的“成功”情况是常见的

如果一个(或两个)有效负载需要昂贵的设置,则来自
还有两个回调。

可能会有所帮助。