是否有基于布尔条件返回结果的组合器?

Is there a combinator for returning a Result based on a boolean condition?

对于选项类型,我经常使用 ok_or 组合器来 return 错误,如下所示:

let my_vec = [1,2,3];

let head = my_vec.first().cloned().ok_or(Error::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_or 组合器?

有一个方法 bool::then(在 Rust 1.50.0 中添加),返回一个 Option<T>,您可以将其转换为 Result<T, E>

您的示例如下所示:

use std::ops::Not;

my_vec.is_empty().not().then(|| ()).ok_or(MyError)

I often write matches to handle this, but it seems quite verbose:

let vec_is_ok = match my_vec.is_empty() {
    true => Err(...),
    false => Ok(())
}
vec_is_ok?;

if 是一个表达式,适用于布尔值:

let vec_is_ok = if my_vec.is_empty() { Err(...) } else { Ok(()) };

Peter Hall 提议的替代方案是更古老但更丰富的 boolinator crate which provides direct support for the Result type 例如

let vec_is_ok = my_vec.is_empty.not().as_result((), ...);

let vec_is_ok = my_vec.is_empty.not().ok_or(...)

后者与前者的“成功”案例基本相同 Ok(()) 因为这很常见。

如果一个(或两个)有效载荷需要昂贵的设置,还有 as_result_from 需要两次回调。