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)
有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值导致None或Err(_).
将这样的功能添加到std RFC库中存在一个问题,但它看起来不会很快发生.
使用一个if表达式:
if my_bool { Ok(()) } else { Err(MyError::False) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |