Abkürzungen: unwrap und expect
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 45 von 66.
Sie haben bereits etwas über .unwrap() und .expect() bei Option gelernt, und dieselben Methoden funktionieren auch mit Result. Ihr Verhalten unterscheidet sich jedoch geringfügig beim Umgang mit Erfolgs- und Fehlerfällen.
Die Methode .unwrap() extrahiert den Wert aus einer Ok-Variante, aber wenn das Result ein Err ist, wird Ihr Programm eine Panic auslösen und abstürzen. Ähnlich verhält es sich mit .expect(), das dasselbe tut, Ihnen jedoch ermöglicht, eine benutzerdefinierte Panic-Meldung anzugeben, die das Debugging erleichtert:
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Gibt aus: Value: 42
// Dies würde mit der benutzerdefinierten Meldung eine Panic auslösen:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Löst eine Panic aus!Während diese Methoden einen schnellen Zugriff auf erfolgreiche Werte ermöglichen, sollten sie mit Vorsicht verwendet werden. Sie sind am besten geeignet, wenn Sie absolut sicher sind, dass die Operation erfolgreich sein wird, oder während der Entwicklung und beim Testen.
Aufgabe
EinfachSie erhalten zwei Eingaben. Die erste Eingabe ist eine Zahl (als String) und die zweite Eingabe ist ein Statusindikator (ok oder error). Erstellen Sie ein Result<i32, &'static str> basierend auf dem Status. Wenn der Status ok ist, erstellen Sie ein Ok, das die geparste Zahl enthält. Wenn der Status error ist, erstellen Sie ein Err mit der Nachricht "Invalid operation". Verwenden Sie .expect() mit einer benutzerdefinierten Nachricht, um den Wert aus dem Result zu extrahieren und ihn auszugeben.
Anforderungen:
- Lesen Sie die erste Eingabe (Zahl) ein und entfernen Sie Leerzeichen
- Parsen Sie die erste Eingabe zu
i32 - Lesen Sie die zweite Eingabe (Status) ein und entfernen Sie Leerzeichen
- Erstellen Sie eine
Result<i32, &'static str>Variable:- Wenn der Status
okist, weisen SieOk(parsed_number)zu - Wenn der Status
errorist, weisen SieErr("Invalid operation")zu
- Wenn der Status
- Verwenden Sie
.expect("Failed to get value"), um den Wert aus demResultzu extrahieren - Geben Sie den extrahierten Wert im Format
Value: [value]aus
Eingabe:
- Erste Zeile: Eine Zahl (z. B.
75) - Zweite Zeile: Entweder
okodererror
Ausgabe:
- Wenn der Status
okist:Value: [number] - Wenn der Status
errorist: Das Programm wird mit der benutzerdefinierten Nachricht in Panik geraten (wird in dieser Challenge nicht getestet)
Hinweis: Für diese Challenge werden die Testfälle nur den Status ok verwenden, um eine erfolgreiche Ausführung zu gewährleisten. Der Fall error würde eine Panic auslösen, was das erwartete Verhalten von .expect() beim Auftreffen auf ein Err ist.
Spickzettel
Die Methoden .unwrap() und .expect() arbeiten mit Result-Typen, um Werte aus der Ok-Variante zu extrahieren.
.unwrap() extrahiert den Wert aus einem Ok, löst jedoch eine Panic aus, wenn das Result ein Err ist:
let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Gibt aus: Value: 42.expect() funktioniert auf die gleiche Weise, ermöglicht es Ihnen jedoch, eine benutzerdefinierte Panic-Meldung für ein einfacheres Debugging bereitzustellen:
let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Gibt aus: Value: 42
// Dies würde mit der benutzerdefinierten Meldung eine Panic auslösen:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // Löst eine Panic mit der benutzerdefinierten Meldung ausDiese Methoden sollten vorsichtig verwendet werden, da sie Ihr Programm zum Absturz bringen, wenn das Result ein Err ist. Sie sind am besten geeignet, wenn Sie sicher sind, dass die Operation erfolgreich sein wird, oder während der Entwicklung und des Testens.
Probier es selbst
use std::io;
fn main() {
// Die erste Eingabe lesen (Zahl)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Die Zahl in i32 umwandeln
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// Die zweite Eingabe lesen (Status)
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: Schreiben Sie Ihren Code unten
// Erstellen Sie ein Result<i32, &'static str> basierend auf dem Status
// Verwenden Sie .expect(), um den Wert zu extrahieren
// Geben Sie das Ergebnis im Format aus: Value: [value]
}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 erstellen7Fehlerbehandlung mit 'Result'
Was ist ein 'Result'?'match' mit 'Result' verwendenis_ok() und is_err()Abkürzungen: unwrap und expectDer Fragezeichen-Operator '?'Strings in Zahlen parsenZusammenfassung – Sichere Divisionsfunktion2Einfü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 Code