Viele Programmiersprachen erlauben die Verwendung von Nullwerten, was zu Null-Pointer-Dereferenzierungsfehlern zur Laufzeit führt. In Rust wurde der generische Typ Option<T> eingeführt, um optionale Werte explizit darzustellen, was Sicherheit gewährleistet und, was wichtig ist, die Berücksichtigung des Falls des Fehlens eines Wertes erzwingt.
Das Fehlen eines Wertes (z. B. wenn das Suchergebnis nicht gefunden wird) führt häufig zu Laufzeitfehlern, wenn dies nicht im Typ reflektiert wird. Eine sichere und explizite Handhabung des Falles eines leeren Wertes verringert die Anzahl der Bugs.
Der Typ Option<T> ist als Enum mit zwei Varianten implementiert: Some(T) (Wert vorhanden) und None (Wert fehlt). Dies ermöglicht dem Compiler, den Programmierer dazu zu bringen, beide Fälle zu berücksichtigen. Jede Verwendung eines optionalen Wertes ohne explizite Überprüfung führt zu einem Kompilierungsfehler.
Beispielcode:
fn divide(a: i32, b: i32) -> Option<i32> { if b == 0 { None } else { Some(a / b) } } let res = divide(6, 3); match res { Some(result) => println!("Ergebnis: {}", result), None => println!("Division durch Null!"), }
Wichtige Merkmale:
Ist Option<T> eine Nullkostenabstraktion oder benötigt jede Option-Variable mehr Speicher?
Ja, in den meisten Fällen ist Option<T> Nullkosten, wenn der Typ T keinen "Nullwert" annehmen kann (z. B. Referenztyp oder Box<T>). Rust nutzt die Optimierung "nullable pointer optimization", und zusätzlicher Speicher wird nicht benötigt.
let value: Option<&u32> = None; // Belegt nicht mehr Platz als eine normale Referenz.
Kann man unwrap ohne Sorge verwenden?
Nein, unwrap() führt zu einem Panic, wenn der Wert None ist. Es sollte nur verwendet werden, wenn garantiert bekannt ist, dass der Wert vorhanden ist, oder man sollte die Methoden unwrap_or, unwrap_or_else oder Pattern Matching bevorzugen.
Wie unterscheidet sich Option von Referenzen (&T, Option<&T>)?
Eine Referenz zeigt immer auf einen bestehenden Wert. Wenn der Wert fehlt, muss Option<&T> verwendet werden, um explizit zu zeigen, dass "nichts vorhanden sein könnte". Die Verwendung von Option anstelle einer direkten Referenz verhindert, dass man auf einen Nullzeiger zugreift.
Eine Funktion gibt das Suchergebnis über Option zurück, aber der aufrufende Code verwendet unwrap und ist sich sicher, dass immer ein Ergebnis vorhanden ist. In Wirklichkeit stürzt das Programm bei Fehlen eines Wertes in der Produktion ab.
Vorteile:
Nachteile:
Der Code verwendet Match zur Verarbeitung von Option, alle Fälle sind eindeutig dokumentiert und durch Tests abgedeckt.
Vorteile:
Nachteile: