Menu
Coddy logo textTech

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().

challenge icon

Défi

Facile

Vous 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 i32 en utilisant .parse::<i32>()
  • Créer une variable Option<i32> :
    • Si la deuxième entrée est valid, assignez Some(parsed_number)
    • Si la deuxième entrée est invalid, assignez None
  • 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 valid soit invalid

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: 42

Attention : 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]
    
}
quiz iconTestez-vous

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