如何以特殊方式将bool转换为Rust中的Option或Result?

hed*_*017 5 types casting type-conversion rust

似乎没有办法使用这种单行转换std.

我不喜欢这种冗长:

match my_bool {
    true => Ok(()),
    false => Err(MyError::False),
}
Run Code Online (Sandbox Code Playgroud)

我想使用某种单线,例如:

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{}
Run Code Online (Sandbox Code Playgroud)

什么是最短的代码呢?

Mic*_*val 17

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{});
Run Code Online (Sandbox Code Playgroud)

在撰写本文时,这仍然是实验bool_to_option功能的一部分。


Ibr*_*med 13

从 Rust 1.50 开始,您可以使用bool::then

assert_eq!(false.then(|| val), None);
assert_eq!(true.then(|| val), Some(val));
Run Code Online (Sandbox Code Playgroud)

您可以Result通过链接将其转换为 a Option::ok_or

assert_eq!(false.then(|| val).ok_or(err), Err(err));
assert_eq!(true.then(|| val).ok_or(err), Ok(val));
Run Code Online (Sandbox Code Playgroud)

在夜间,您可以bool::then_some直接使用和传递一个值,而不是创建一个闭包:

#![feature(bool_to_option)]

assert_eq!(false.then_some(val), None);
assert_eq!(true.then_some(val), Some(val));
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Option::filter

assert_eq!(Some(obj).filter(|_| false), None);
assert_eq!(Some(obj).filter(|_| true).ok_or(err), Ok(obj));
Run Code Online (Sandbox Code Playgroud)


Luk*_*odt 7

boolinator箱子.它定义了扩展特征Boolinator,bool为其添加了一些有用的方法.例:

use boolinator::Boolinator;

my_bool.as_some(MyObject {});                // Option<MyObject>
my_bool.as_result(MyObject {}, MyError {});  // Result<MyObject, MyError>
Run Code Online (Sandbox Code Playgroud)

一个true值导致Some(_)或者Ok(_),而false值导致NoneErr(_).

将这样的功能添加到std RFC库中存在一个问题,但它看起来不会很快发生.


She*_*ter 7

使用一个if表达式:

if my_bool { Ok(()) } else { Err(MyError::False) }
Run Code Online (Sandbox Code Playgroud)