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.