10
votes

Comment convertir idiomatiquement un booléen en option ou en résultat dans Rust?

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?


0 commentaires

4 Réponses :


11
votes

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.


0 commentaires

9
votes

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 .


0 commentaires

1
votes

Utilisez une expression if :

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


0 commentaires

0
votes

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.


0 commentaires