[英]How do I idiomatically convert a bool to an Option or Result in Rust?
似乎没有办法使用std
进行这种单行转换。
我不喜欢这种冗长:
match my_bool {
true => Ok(()),
false => Err(MyError::False),
}
我想使用单线,例如:
let my_bool = true;
let my_option = my_bool.to_option(MyObject{}); // true => MyObject{}, false => None
let my_result = my_bool.to_result(MyObject{}, MyError{}); // true => MyObject{}, false => MyError{}
最短的代码是什么?
从 Rust 1.50 开始,您可以使用bool::then
:
assert_eq!(false.then(|| val), None);
assert_eq!(true.then(|| val), Some(val));
您可以通过链接Option::ok_or
将其转换为Result
:
assert_eq!(false.then(|| val).ok_or(err), Err(err));
assert_eq!(true.then(|| val).ok_or(err), Ok(val));
从 Rust 1.62 开始,您可以使用bool::then_some
并直接传递一个值,而不是创建一个闭包:
assert_eq!(false.then_some(val), None);
assert_eq!(true.then_some(val), Some(val));
或者,您可以使用Option::filter
:
assert_eq!(Some(obj).filter(|_| false), None);
assert_eq!(Some(obj).filter(|_| true).ok_or(err), Ok(obj));
bool.then_some()
这样做:
let my_bool = true;
let my_option = my_bool.then_some(MyObject{});
let my_result = my_bool.then_some(MyObject{}).ok_or(MyError{});
在撰写本文时,这仍然是实验性bool_to_option
功能的一部分。
更新:从 Rust 1.62 开始,此功能已稳定。
这个答案有些过时了。 从 Rust 1.50 开始,您可以使用内置的bool::then
。 有关更多信息,请参阅上面的其他答案。
有boolinator
crate 。 它为bool
定义 了扩展特征Boolinator
,它添加了几个有用的方法。 例子:
use boolinator::Boolinator;
my_bool.as_some(MyObject {}); // Option<MyObject>
my_bool.as_result(MyObject {}, MyError {}); // Result<MyObject, MyError>
true
值导致Some(_)
或Ok(_)
,而false
值导致None
或Err(_)
。
将此类功能添加到 RFC 存储库上的std
存在问题,但它看起来不会很快发生。
使用if
表达式:
if my_bool { Ok(()) } else { Err(MyError::False) }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.