Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Sie 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 i32 mit .parse::<i32>()
  • Erstellen Sie eine Option<i32> Variable:
    • Wenn die zweite Eingabe valid ist, weisen Sie Some(parsed_number) zu
    • Wenn die zweite Eingabe invalid ist, weisen Sie None zu
  • Verwenden Sie .unwrap(), um den Wert aus dem Option zu extrahieren
  • Geben Sie den extrahierten Wert im Format Value: [number] aus

Eingabe:

  • Erste Zeile: Eine Zahl als String (z. B. 42)
  • Zweite Zeile: Entweder valid oder invalid

Ausgabe:

  • Wenn die zweite Eingabe valid ist: Value: [number]
  • Wenn die zweite Eingabe invalid ist: 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: 42

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