Menu
Coddy logo textTech

Die 'expect'-Methode

Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 39 von 66.

Während .unwrap() seine Aufgabe erfüllt, hat es einen großen Nachteil: Wenn es bei einem None einen Panic auslöst, ist die Fehlermeldung generisch und wenig hilfreich. Hier kommt .expect() zur Rettung.

Die Methode .expect() funktioniert genau wie .unwrap() – sie extrahiert den Wert aus einem Some und löst bei einem None eine Panic aus. Der Hauptunterschied besteht darin, dass .expect() es Ihnen ermöglicht, eine benutzerdefinierte Panic-Nachricht anzugeben:

let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);

Wenn das Option ein Some enthält, gibt .expect() den inneren Wert zurück, genau wie .unwrap(). Wenn es jedoch ein None ist, sehen Sie anstelle einer generischen Panic-Meldung Ihre benutzerdefinierte Nachricht, was es viel einfacher macht zu verstehen, was schiefgelaufen ist und wo.

challenge icon

Aufgabe

Einfach

Sie erhalten zwei Eingaben. Die erste Eingabe ist ein Produktname, und die zweite Eingabe gibt an, ob das Produkt auf Lager ist (yes) oder nicht (no). Erstellen Sie ein Option<String>, das Some(product_name) enthält, wenn das Produkt auf Lager ist, oder None, wenn es nicht auf Lager ist. Verwenden Sie .expect() mit einer aussagekräftigen Nachricht, um den Produktnamen zu extrahieren und auszugeben.

Anforderungen:

  • Lesen Sie die erste Eingabe (Produktname) ein und entfernen Sie Leerzeichen am Anfang und Ende
  • Lesen Sie die zweite Eingabe (Lagerstatus) ein und entfernen Sie Leerzeichen am Anfang und Ende
  • Erstellen Sie eine Option<String>-Variable:
    • Wenn der Lagerstatus yes ist, weisen Sie Some(product_name.to_string()) zu
    • Wenn der Lagerstatus no ist, weisen Sie None zu
  • Verwenden Sie .expect() mit der Nachricht "Product should be in stock", um den Produktnamen zu extrahieren
  • Geben Sie den extrahierten Produktnamen im Format Product available: [product_name] aus

Eingabe:

  • Erste Zeile: Ein Produktname (z. B. Laptop)
  • Zweite Zeile: Entweder yes oder no

Ausgabe:

  • Wenn der Lagerstatus yes ist: Product available: [product_name]
  • Wenn der Lagerstatus no ist: Das Programm wird mit der benutzerdefinierten Nachricht "Product should be in stock" abbrechen (dies ist das erwartete Verhalten für diese Herausforderung)

Hinweis: Wenn der Lagerstatus no ist, führt der Aufruf von .expect() auf None zu einem Panic mit Ihrer benutzerdefinierten Nachricht. Dies zeigt, wie .expect() im Vergleich zu .unwrap() hilfreichere Fehlerinformationen liefert.

Spickzettel

Die Methode .expect() funktioniert wie .unwrap(), erlaubt es Ihnen jedoch, eine benutzerdefinierte Panic-Nachricht für ein besseres Error-Debugging bereitzustellen.

Wenn sie auf einem Option-Typ aufgerufen wird:

  • Wenn sie Some enthält, gibt sie den inneren Wert zurück
  • Wenn sie None enthält, löst sie eine Panic mit Ihrer benutzerdefinierten Nachricht aus
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);

Die benutzerdefinierte Fehlermeldung erleichtert es zu identifizieren, was schiefgelaufen ist und wo in Ihrem Code dies geschah.

Probier es selbst

use std::io;

fn main() {
    // Produktnamen lesen
    let mut product_name = String::new();
    io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim();
    
    // Lagerstatus lesen
    let mut stock_status = String::new();
    io::stdin().read_line(&mut stock_status).expect("Failed to read line");
    let stock_status = stock_status.trim();
    
    // TODO: Schreiben Sie Ihren Code unten
    // Erstellen Sie ein Option<String> basierend auf stock_status
    // Verwenden Sie .expect(), um den Produktnamen zu extrahieren
    // Geben Sie das Ergebnis im Format aus: Product available: [product_name]
    
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow