Déballer une 'Option'
Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 38 sur 66.
Parfois, vous devez extraire la valeur réelle d'un Option lorsque vous êtes certain qu'il contient un Some. Rust fournit la méthode .unwrap() à cet effet - elle extrait la valeur d'un Some et vous la donne directement.
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);Lorsque vous appelez .unwrap() sur un Some(value), cela retourne la valeur interne. Dans l'exemple ci-dessus, actual_number devient 42 - n'est plus enveloppé dans un Option.
Cependant, il y a un avertissement critique : si vous appelez .unwrap() sur un None, votre programme va paniquer et s'arrêter immédiatement. Cela fait de .unwrap() une méthode potentiellement dangereuse qui ne devrait être utilisée que lorsque vous êtes absolument certain que l'Option contient un Some.
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Cela va paniquer !Utilisez .unwrap() avec parcimonie et seulement dans les situations où vous pouvez garantir que l'Option contient une valeur, comme dans des exemples simples ou lorsque vous avez déjà vérifié avec .is_some().
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 indique si ce nombre doit être traité comme valide ou invalide. Si la deuxième entrée est valid, créez une Option<i32> contenant Some avec le nombre analysé. Si la deuxième entrée est invalid, créez une Option<i32> contenant None. Utilisez .unwrap() pour extraire la valeur de l'Option et l'afficher.
Exigences :
- Lire la première entrée et supprimer les espaces blancs
- Lire la deuxième entrée et supprimer les espaces blancs
- Analyser la première entrée en
i32en utilisant.parse::<i32>() - Créer une variable
Option<i32>:- Si la deuxième entrée est
valid, assignezSome(parsed_number) - Si la deuxième entrée est
invalid, assignezNone
- Si la deuxième entrée est
- Utilisez
.unwrap()pour extraire la valeur de l'Option - Affichez la valeur extraite au format :
Value: [number]
Entrée :
- Première ligne : Un nombre sous forme de chaîne (par exemple,
42) - Deuxième ligne : Soit
validsoitinvalid
Sortie :
- Si la deuxième entrée est
valid:Value: [number] - Si la deuxième entrée est
invalid: Le programme va paniquer (c'est le comportement attendu pour ce défi)
Remarque : Lorsque la deuxième entrée est invalid, l'appel de .unwrap() sur None provoquera une panique. Cela démontre la nature dangereuse de .unwrap() lorsque vous n'êtes pas certain que l'Option contient une valeur.
Aide-mémoire
La méthode .unwrap() extrait la valeur d'un Option<T> :
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // Affiche : The number is: 42Attention : Appeler .unwrap() sur None provoquera une panique (panic) et le plantage de votre programme :
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Cela provoquera une panique !N'utilisez .unwrap() que lorsque vous êtes absolument certain que l'Option contient une valeur Some.
Essayez vous-même
use std::io;
fn main() {
// Lire la première entrée (nombre sous forme de chaîne)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Lire la deuxième entrée (valide ou invalide)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// Analyser le nombre
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO : Écrivez votre code ci-dessous
// Créer une Option<i32> basée sur validity_input
// Si validity_input est "valid", assigner Some(parsed_number)
// Si validity_input est "invalid", assigner None
// Ensuite, utiliser .unwrap() pour extraire la valeur et l'afficher au format : Value: [number]
}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 Book2Introduction 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 final6Gérer l'absence avec 'Option'
Qu'est-ce qu'une 'Option' ?Utiliser 'match' avec 'Option'is_some() et is_none()Déballer une 'Option'La méthode expectFournir une valeur par défaut : unwrap_orRécapitulatif - Trouver un élément