Achtergrond:
Rust volgt de filosofie van expliciete initialisatie. Voor bepaalde standaardcollecties en generieke types is het vaak nodig om een "standaard" waarde te hebben. Voor complexe structuren is het echter vaak onduidelijk hoe ze zonder parameters te creëren. Hiervoor is de trait Default geïntroduceerd, die een standaardconstructor definieert.
Probleem:
Om universele containers en algoritmen te schrijven, waar soms een standaardwaarde wordt verwacht (bijvoorbeeld in Option::unwrap_or_default, Vec::resize), is er een mechanisme nodig om een instantie aan te maken zonder argumenten door te geven. Maar niet alle types zijn geschikt voor zo'n constructor; soms kan de standaardwaarde onduidelijk en gevaarlijk zijn.
Oplossing:
default() biedt, die een bepaalde instantie retourneert (meestal "leeg", zeroed of met voorwaarden).Voorbeeldcode:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Belangrijke kenmerken:
Zal Default::default gedwongen worden aangeroepen voor Option<T>, als T: Default?
Nee, Option roept default voor T niet automatisch aan; unwrap_or_default wordt expliciet aangeroepen.
Kunnen parameters met een standaardwaarde worden ingesteld via de Default trait in de constructor van de structuur?
Nee, Default maakt de gehele structuur aan, individuele velden met standaardwaarden kunnen niet worden vervangen met de normale constructor-syntaxis.
Kan derive(Default) falen voor een structuur met velden die Default niet implementeren?
Ja, derive(Default) werkt alleen als alle velden van de structuur Default implementeren.
Config c Default, waar de serverpoort - 0 (ongeldig standaardtype). Het programma start onverwacht niet op de juiste poort.
Voordelen:
Nadelen:
Default voor een configuratiestructuur met veilige, consensuswaardige waarden (retries=3, verbose=false).
Voordelen:
Nadelen: