Menu
Coddy logo textTech

Der Fragezeichen-Operator '?'

Teil des Abschnitts Logik & Kontrollfluss der Rust-Journey von Coddy. Lektion 46 von 66.

Wenn du mit Funktionen arbeitest, die Result zurückgeben, musst du Fehler häufig entweder lokal behandeln oder an die aufrufende Funktion weitergeben. Rust bietet für dieses verbreitete Muster einen eleganten Operator: den Fragezeichenoperator ?.

Der Operator ? bietet eine übersichtliche Möglichkeit, Fehler weiterzugeben, ohne ausführliche match-Anweisungen zu schreiben. Wenn du ? nach einem Result platzierst, wird ein Ok-Wert automatisch entpackt oder die aktuelle Funktion sofort mit dem Err beendet:

fn parse_and_double(s: &str) -> Result<i32, std::num::ParseIntError> {
    let number = s.parse::<i32>()?; // Wenn das Parsen fehlschlägt, gib den Fehler zurück
    Ok(number * 2) // Wenn erfolgreich, verdopple die Zahl
}

Dies entspricht dem Schreiben einer vollständigen match-Anweisung, ist aber wesentlich prägnanter. Wenn s.parse::<i32>() ein Ok zurückgibt, extrahiert ? den Wert und weist ihn number zu. Wenn es ein Err zurückgibt, gibt ? diesen Fehler sofort aus der gesamten Funktion zurück.

Beachte die Syntax ::<i32>. Sie wird Turbofish genannt und teilt Rust mit, in welchen Typ die Zeichenfolge geparst werden soll. Die Funktion gibt Result<i32, std::num::ParseIntError> zurück, wobei i32 der Erfolgstyp und std::num::ParseIntError der Fehlertyp ist, der zurückgegeben wird, wenn das Parsen fehlschlägt.

Der Operator ? kann nur in Funktionen verwendet werden, die ein Result (oder Option) zurückgeben, da er in der Lage sein muss, einen Fehler zurückzugeben.

challenge icon

Aufgabe

Einfach

Du erhältst zwei Eingaben. Die erste Eingabe ist eine Zeichenkette, die in eine Ganzzahl umgewandelt werden soll, und die zweite Eingabe ist eine weitere Zeichenkette, die ebenfalls in eine Ganzzahl umgewandelt werden soll. Erstelle eine Funktion namens add_numbers, die zwei String-Slices als Parameter entgegennimmt und ein Result<i32, std::num::ParseIntError> zurückgibt. Verwende innerhalb der Funktion den ?-Operator, um beide Zeichenketten zu parsen, und gib ihre Summe verpackt in Ok zurück. Rufe die Funktion mit den beiden Eingaben auf und verarbeite das Ergebnis mit match.

Anforderungen:

  • Lies die erste Eingabe (erste Zahl als Zeichenkette) ein und entferne Leerzeichen
  • Lies die zweite Eingabe (zweite Zahl als Zeichenkette) ein und entferne Leerzeichen
  • Erstelle eine Funktion add_numbers, die zwei &str-Parameter entgegennimmt und Result<i32, std::num::ParseIntError> zurückgibt
  • Parse innerhalb der Funktion die erste Zeichenkette mit dem i32-Operator zu ?
  • Parse die zweite Zeichenkette mit dem i32-Operator zu ?
  • Gib Ok(sum) zurück, wobei sum die Addition beider geparster Zahlen ist
  • Rufe die Funktion mit den beiden Eingabezeichenketten auf
  • Verwende einen match-Ausdruck, um das Result zu verarbeiten
  • Gib im Ok(value)-Arm Folgendes aus: Sum: [value]
  • Gib im Err(_)-Arm Folgendes aus: Parsing error

Eingabe:

  • Erste Zeile: Eine Zeichenkette, die eine Zahl darstellt (z. B. 15)
  • Zweite Zeile: Eine Zeichenkette, die eine weitere Zahl darstellt (z. B. 27)

Ausgabe:

  • Wenn beide Zeichenketten gültige Zahlen sind: Sum: [result]
  • Wenn eine der Zeichenketten nicht geparst werden kann: Parsing error

Probier es selbst

use std::io;

// TODO: Erstelle die add_numbers-Funktion hier
// Sie sollte zwei &str-Parameter entgegennehmen und Result<i32, std::num::ParseIntError> zurückgeben


fn main() {
    // Erste Eingabe lesen
    let mut input1 = String::new();
    io::stdin().read_line(&mut input1).expect("Failed to read line");
    let input1 = input1.trim();
    
    // Zweite Eingabe lesen
    let mut input2 = String::new();
    io::stdin().read_line(&mut input2).expect("Failed to read line");
    let input2 = input2.trim();
    
    // TODO: Rufe add_numbers mit input1 und input2 auf
    // TODO: Verwende match, um das Result zu behandeln
    // Gib "Sum: [value]" für Ok(value) aus
    // Print "Parsing error" for Err(_)
}
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 Logik & Kontrollfluss

Übe selbstständig: Online-Rust-Compiler