簡體   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