Menu
Coddy logo textTech

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.

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 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, assigner Ok(parsed_number)
    • Si le statut est error, assigner Err("Invalid operation")
  • Utiliser .expect("Failed to get value") pour extraire la valeur du Result
  • Afficher la valeur extraite au format : Value: [value]

Entrée :

  • Première ligne : Un nombre (par exemple, 75)
  • Deuxième ligne : Soit ok, soit error

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]
    
}
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