似乎无法使用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),
}
最短的代码是什么?
答案 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
值导致None
或Err(_)
。
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{});
值导致true
或Some(_)
,而Ok(_)
值导致false
或None
。