Ein 'Option' entpacken
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 38 von 66.
Manchmal müssen Sie den tatsächlichen Wert aus einem Option extrahieren, wenn Sie sicher sind, dass es ein Some enthält. Rust bietet die .unwrap()-Methode für diesen Zweck an – sie nimmt den Wert aus einem Some heraus und gibt ihn Ihnen direkt.
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);Wenn Sie .unwrap() auf ein Some(value) aufrufen, gibt es den inneren Wert zurück. Im obigen Beispiel wird actual_number zu 42 – nicht mehr in einem Option eingeschlossen.
Es gibt jedoch eine kritische Warnung: Wenn Sie .unwrap() auf einem None aufrufen, wird Ihr Programm eine Panic auslösen und sofort abstürzen. Dies macht .unwrap() zu einer potenziell gefährlichen Methode, die nur verwendet werden sollte, wenn Sie absolut sicher sind, dass das Option ein Some enthält.
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Dies wird eine Panic auslösen!Verwenden Sie .unwrap() sparsam und nur in Situationen, in denen Sie garantieren können, dass das Option einen Wert enthält, wie zum Beispiel in einfachen Beispielen oder wenn Sie bereits mit .is_some() geprüft haben.
Aufgabe
EinfachSie erhalten zwei Eingaben. Die erste Eingabe ist eine Zahl (als String), und die zweite Eingabe gibt an, ob diese Zahl als gültig oder ungültig behandelt werden soll. Wenn die zweite Eingabe valid ist, erstellen Sie ein Option<i32>, das Some mit der parsten Zahl enthält. Wenn die zweite Eingabe invalid ist, erstellen Sie ein Option<i32>, das None enthält. Verwenden Sie .unwrap(), um den Wert aus dem Option zu extrahieren und ihn auszugeben.
Anforderungen:
- Lesen Sie die erste Eingabe ein und entfernen Sie Leerzeichen (trim)
- Lesen Sie die zweite Eingabe ein und entfernen Sie Leerzeichen (trim)
- Parsen Sie die erste Eingabe zu
i32mit.parse::<i32>() - Erstellen Sie eine
Option<i32>Variable:- Wenn die zweite Eingabe
validist, weisen SieSome(parsed_number)zu - Wenn die zweite Eingabe
invalidist, weisen SieNonezu
- Wenn die zweite Eingabe
- Verwenden Sie
.unwrap(), um den Wert aus demOptionzu extrahieren - Geben Sie den extrahierten Wert im Format
Value: [number]aus
Eingabe:
- Erste Zeile: Eine Zahl als String (z. B.
42) - Zweite Zeile: Entweder
validoderinvalid
Ausgabe:
- Wenn die zweite Eingabe
validist:Value: [number] - Wenn die zweite Eingabe
invalidist: Das Programm wird paniken (dies ist das erwartete Verhalten für diese Herausforderung)
Hinweis: Wenn die zweite Eingabe invalid ist, führt der Aufruf von .unwrap() auf None zu einer Panic. Dies demonstriert die gefährliche Natur von .unwrap(), wenn Sie nicht sicher sind, ob das Option einen Wert enthält.
Spickzettel
Die Methode .unwrap() extrahiert den Wert aus einem Option<T>:
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // Gibt aus: The number is: 42Warnung: Der Aufruf von .unwrap() auf None führt dazu, dass Ihr Programm eine Panic auslöst und abstürzt:
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Dies wird eine Panic auslösen!Verwenden Sie .unwrap() nur dann, wenn Sie absolut sicher sind, dass die Option einen Some-Wert enthält.
Probier es selbst
use std::io;
fn main() {
// Erste Eingabe lesen (Zahl als String)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Zweite Eingabe lesen (valid oder invalid)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// Die Zahl parsen
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO: Schreiben Sie Ihren Code unten
// Erstellen Sie ein Option<i32> basierend auf validity_input
// Wenn validity_input "valid" ist, weisen Sie Some(parsed_number) zu
// Wenn validity_input "invalid" ist, weisen Sie None zu
// Verwenden Sie dann .unwrap(), um den Wert zu extrahieren und geben Sie ihn im Format aus: Value: [number]
}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