繁体   English   中英

如何在 Rust 中惯用地将 bool 转换为 Option 或 Result?

[英]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值导致NoneErr(_)

将此类功能添加到 RFC 存储库上的std存在问题,但它看起来不会很快发生。

使用if表达式:

if my_bool { Ok(()) } else { Err(MyError::False) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM