[英]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.