是否有基于布尔条件返回结果的组合器?
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
需要两次回调。
对于选项类型,我经常使用 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
需要两次回调。