Raccourcis : unwrap et expect
Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 45 sur 66.
Vous avez déjà découvert .unwrap() et .expect() avec Option, et ces mêmes méthodes fonctionnent également avec Result. Cependant, leur comportement est légèrement différent lorsqu'il s'agit de cas de succès et d'échec.
La méthode .unwrap() extrait la valeur d'une variante Ok, mais si le Result est un Err, votre programme paniquera et s'arrêtera brutalement. De même, .expect() fait la même chose mais vous permet de fournir un message de panique personnalisé qui facilite le débogage :
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Prints: Value: 42
// This would panic with the custom message:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Panics!Bien que ces méthodes offrent un accès rapide aux valeurs réussies, elles doivent être utilisées avec prudence. Elles sont plus appropriées lorsque vous êtes absolument certain que l'opération réussira, ou pendant le développement et les tests.
Défi
FacileVous recevrez deux entrées. La première entrée est un nombre (sous forme de chaîne de caractères), et la deuxième entrée est un indicateur de statut (ok ou error). Créez un Result<i32, &'static str> basé sur le statut. Si le statut est ok, créez un Ok contenant le nombre analysé. Si le statut est error, créez un Err avec le message "Invalid operation". Utilisez .expect() avec un message personnalisé pour extraire la valeur du Result et l'afficher.
Exigences :
- Lire la première entrée (nombre) et supprimer les espaces blancs
- Analyser la première entrée en
i32 - Lire la deuxième entrée (statut) et supprimer les espaces blancs
- Créer une variable
Result<i32, &'static str>:- Si le statut est
ok, assignerOk(parsed_number) - Si le statut est
error, assignerErr("Invalid operation")
- Si le statut est
- Utiliser
.expect("Failed to get value")pour extraire la valeur duResult - Afficher la valeur extraite au format :
Value: [value]
Entrée :
- Première ligne : Un nombre (par exemple,
75) - Deuxième ligne : Soit
ok, soiterror
Sortie :
- Si le statut est
ok:Value: [number] - Si le statut est
error: Le programme paniquera avec le message personnalisé (non testé dans ce défi)
Remarque : Pour ce défi, les cas de test n'utiliseront que le statut ok pour garantir une exécution réussie. Le cas error provoquerait une panique, ce qui est le comportement attendu de .expect() lors de la rencontre d'un Err.
Aide-mémoire
Les méthodes .unwrap() et .expect() fonctionnent avec les types Result pour extraire les valeurs de la variante Ok.
.unwrap() extrait la valeur d'un Ok, mais panique si le Result est un Err :
let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Affiche : Value: 42.expect() fonctionne de la même manière mais vous permet de fournir un message de panique personnalisé pour faciliter le débogage :
let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Affiche : Value: 42
// Ceci paniquerait avec le message personnalisé :
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // Panique avec le message personnaliséCes méthodes doivent être utilisées avec précaution, car elles feront planter votre programme si le Result est un Err. Elles sont plus appropriées lorsque vous êtes certain que l'opération réussira ou pendant le développement et les tests.
Essayez vous-même
use std::io;
fn main() {
// Lire la première entrée (nombre)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Convertir le nombre en i32
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// Lire la deuxième entrée (statut)
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: Écrivez votre code ci-dessous
// Créer un Result<i32, &'static str> basé sur le statut
// Utiliser .expect() pour extraire la valeur
// Afficher le résultat au format : Value: [value]
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Structures de contrôle avancées
L'expression 'match'Filtrage de plusieurs valeursFiltrage d'intervallesL'expression 'if let'Les boucles en tant qu'expressionsRécapitulatif - Analyseur de commandes simple4Regrouper des données avec les structures
Qu'est-ce qu'une structure ?Aperçu des structuresAccéder aux champs d'une structureStructures mutablesLes structures comme paramètres de fonctionStructures tupleRécapitulatif - Créer une structure Book7Gestion des erreurs avec 'Result'
Qu'est-ce qu'un 'Result' ?Utiliser 'match' avec 'Result'is_ok() et is_err()Raccourcis : unwrap et expectL'opérateur point d'interrogation '?'Analyse de chaînes en nombresRécapitulatif - Fonction de division sécurisée2Introduction aux vecteurs
Qu'est-ce qu'un vecteur ?Créer un vecteurAjouter des éléments avec pushAccéder aux éléments d'un vecteurItérer sur un vecteurItération mutableSupprimer des élémentsRécapitulatif - Suivi de score basique5Paires clé-valeur avec les Hash Maps
Qu'est-ce qu'une Hash Map ?Créer une Hash MapInsérer des paires clé-valeurAccéder aux valeursParcourir une Hash MapMettre à jour une valeurSupprimer une paireRécapitulatif - Compteur de mots8Projet : Inventaire d'articles simple
Configuration du projetAjouter un articleVérifier le stockVendre un articleAssembler le tout3Liste de tâches en ligne de commande
Configuration du projetAjouter une tâcheAfficher toutes les tâchesSupprimer une tâcheCode final