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.
Aufgabe
EinfachSie 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
yesist, weisen SieSome(product_name.to_string())zu - Wenn der Lagerstatus
noist, weisen SieNonezu
- Wenn der Lagerstatus
- 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
yesoderno
Ausgabe:
- Wenn der Lagerstatus
yesist:Product available: [product_name] - Wenn der Lagerstatus
noist: 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
Someenthält, gibt sie den inneren Wert zurück - Wenn sie
Noneenthä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]
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittener Kontrollfluss
Der 'match'-AusdruckAbgleichen mehrerer WerteBereiche abgleichenDer 'if let'-AusdruckSchleifen als AusdrückeRückblick – Einfacher Befehls-Parser4Daten gruppieren mit Structs
Was ist ein Struct?Übersicht über StructsZugriff auf Struct-FelderVeränderbare StructsStructs als FunktionsparameterTupel-StructsZusammenfassung – Ein Buch-Struct erstellen2Einführung in Vektoren
Was ist ein Vektor?Einen Vektor erstellenElemente mit push hinzufügenZugriff auf Vektor-ElementeÜber einen Vektor iterierenVeränderliche IterationElemente entfernenZusammenfassung – Einfacher Score-Tracker5Schlüssel-Wert-Paare mit Hash Maps
Was ist eine Hash Map?Erstellen einer Hash MapEinfügen von Schlüssel-Wert-PaarenZugreifen auf WerteIterieren über eine Hash MapAktualisieren eines WertesEntfernen eines PaaresZusammenfassung – Wortzähler8Projekt: Einfaches Artikelinventar
Projekt-SetupEinen Artikel hinzufügenLagerbestand prüfenEinen Artikel verkaufenAlles zusammenfügen11Abschluss-Herausforderungen
Wiederholung - Einzigartige ElementeWiederholung - Benutzerprofil-ValidatorWiederholung - Noten-Zusammenfassung3Kommandozeilen-To-Do-Liste
Projekt-SetupEine Aufgabe hinzufügenAlle Aufgaben anzeigenEine Aufgabe entfernenFinaler Code6Umgang mit fehlenden Werten mit 'Option'
Was ist ein 'Option'?'match' mit 'Option' verwendenis_some() und is_none()Ein 'Option' entpackenDie 'expect'-MethodeStandardwert bereitstellen: unwrap_orRückblick – Ein Element finden