如何在Rust中习惯性地将布尔值转换为选项或结果?

时间:2019-02-23 12:00:15

标签: types casting rust type-conversion

似乎无法使用UPDATE stock s JOIN buffer_details d1 ON s.reference = d1.reference_produit SET s.qte = s.qte + d1.qte 进行这种单行转换。

我不喜欢这样的冗长:

std

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

match my_bool {
    true => Ok(()),
    false => Err(MyError::False),
}

最短的代码是什么?

4 个答案:

答案 0 :(得分:10)

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功能的一部分。

答案 1 :(得分:7)

boolinator crate。它为bool定义了the extension trait 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储存库中有一个issue about adding functionality like this to std,但看起来它不会很快发生。

答案 2 :(得分:2)

使用if表达式:

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

答案 3 :(得分:1)

似乎无法使用MarketAdapter(model, { modelCart: ModelCart, view:TextView -> increaseValue(modelCart, view) } }) 进行这种单行转换。

实际上,std有一个filter方法用于此精确目的:

Option

您可以通过链接ok_or将其转换为let my_option = Some(MyObject{}).filter(|_| my_bool);

Result

let my_result = Some(MyObject{}).filter(|_| my_bool).ok_or(MyError{}); 值导致trueSome(_),而Ok(_)值导致falseNone