Veel programmeertalen staan het gebruik van null-waarden toe, wat leidt tot null pointer dereference-fouten tijdens runtime. In Rust is er een universeel type Option<T> geïntroduceerd om optionele waarden expliciet weer te geven, wat veiligheid biedt en, belangrijker nog, de programmeur dwingt om het ontbreken van een waarde in overweging te nemen.
Het ontbreken van een waarde (bijvoorbeeld als de zoekresultaten niet worden gevonden) leidt vaak tot runtime-fouten als dit niet in het type wordt weerspiegeld. Veilige en expliciete behandeling van het geval van een lege waarde vermindert het aantal bugs.
Het Option<T> type is geïmplementeerd als een enum met twee varianten: Some(T) (de waarde is aanwezig) en None (de waarde ontbreekt). Dit dwingt de compiler om de programmeur beide gevallen te laten overwegen. Elk gebruik van een optionele waarde zonder expliciete controle leidt tot een compileerfout.
Voorbeeldcode:
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!("Resultaat: {}", result), None => println!("Delen door nul!"), }
Belangrijkste kenmerken:
Is Option<T> een zero-cost abstractie, of neemt elke Option-variabele meer ruimte in?
Ja, in de meeste gevallen is Option<T> een zero-cost, wanneer het type T geen "nul" waarde kan aannemen (bijvoorbeeld referentietypes of Box<T>). Rust maakt gebruik van de optimalisatie "nullable pointer optimization", en vereist geen extra geheugen.
let value: Option<&u32> = None; // Neemt niet meer ruimte in dan een normale referentie.
Kan unwrap zonder angst worden gebruikt?
Nee, unwrap() leidt tot paniek bij de waarde None. Het moet alleen worden gebruikt wanneer het gegarandeerd bekend is dat de waarde aanwezig is, of het is beter om de methoden unwrap_or, unwrap_or_else, of pattern matching te gebruiken.
Wat is het verschil tussen Option en referenties (&T, Option<&T>)?
Een referentie wijst altijd naar een bestaande waarde. Als de waarde ontbreekt, moet Option<&T> worden gebruikt om expliciet aan te geven dat "het kan niets zijn". Het gebruik van Option in plaats van een directe referentie voorkomt race conditions met een null pointer.
Een functie retourneert het zoekresultaat via Option, maar de aanroepende code gebruikt unwrap, ervan overtuigd dat er altijd een resultaat is. In werkelijkheid crasht het programma in productie bij afwezigheid van een waarde.
Voordelen:
Nadelen:
De code gebruikt match om Option af te handelen; alle gevallen zijn expliciet gedocumenteerd en gedekt door tests.
Voordelen:
Nadelen: