Il semble qu'il n'y ait aucun moyen d'une telle conversion en une ligne en utilisant std
.
Je n'aime pas ce genre de verbosité:
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{}
Je voudrais utiliser une sorte de one-liner, par exemple:
match my_bool { true => Ok(()), false => Err(MyError::False), }
Quel est le morceau de code le plus court faisant cela?
4 Réponses :
Il y a la caisse du boolinator
. Il définit le trait d'extension Boolinator
pour bool
qui ajoute quelques méthodes utiles. Exemple:
use boolinator::Boolinator; my_bool.as_some(MyObject {}); // Option<MyObject> my_bool.as_result(MyObject {}, MyError {}); // Result<MyObject, MyError>
Une valeur true
mène à Some(_)
ou Ok(_)
, tandis qu'une valeur false
mène à None
ou Err(_)
.
Il y a un problème concernant l'ajout de fonctionnalités comme celle-ci à std
sur le référentiel RFC, mais il ne semble pas que cela se produise de sitôt.
bool.then_some()
fait ceci:
let my_bool = true; let my_option = my_bool.then_some(MyObject{}); let my_result = my_bool.then_some(MyObject{}).ok_or(MyError{});
Au moment de la rédaction de cet article, cela fait toujours partie de la fonctionnalité expérimentale bool_to_option
.
Utilisez une expression if
:
if my_bool { Ok(()) } else { Err(MyError::False) }
Vous pouvez utiliser Option::filter
:
let my_option = Some(MyObject{}).filter(|_| my_bool); let my_result = Some(MyObject{}).filter(|_| my_bool).ok_or(MyError{});
Une valeur true
mène à Some(_)
ou Ok(_)
, tandis qu'une valeur false
mène à None
ou Err(_)
. Vous pouvez le faire sur Rust stable sans dépendances externes.