Hintergrund:
Rust folgt der Philosophie der expliziten Initialisierung. Für einige Standardkollektionen und generische Typen ist es oft erforderlich, einen "Standardwert" zu haben. Bei komplexen Strukturen ist es jedoch häufig unklar, wie man sie ohne Parameter erstellen kann. Zu diesem Zweck wurde das Trait Default eingeführt, das einen Standardkonstruktor festlegt.
Problem:
Um universelle Container und Algorithmen zu schreiben, bei denen manchmal ein Standardwert erwartet wird (z. B. in Option::unwrap_or_default, Vec::resize), benötigt man einen Mechanismus, um Instanzen ohne Übergabe von Argumenten zu erstellen. Aber nicht alle Typen eignen sich für solch einen Konstruktor; manchmal kann der Standardwert unklar und gefährlich sein.
Lösung:
default(), die eine Instanz zurückgibt (normalerweise "leer", null oder mit Vorbedingungen).derive(Default) verwenden oder es manuell implementieren, wenn die Logik nicht trivial ist.Beispielcode:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Schlüsselfunktionen:
Default::default() erstellt.Wird Default::default für Option<T> gezwungenermaßen aufgerufen, wenn T: Default?
Nein, Optional ruft default für T nicht automatisch auf; unwrap_or_default wird explizit aufgerufen.
Können Standardparameter durch das Default-Trait im Konstruktor einer Struktur angegeben werden?
Nein, Default erstellt die gesamte Struktur, individuelle Standardfelder können nicht mit der normalen Konstruktor-Syntax ersetzt werden.
Kann derive(Default) für eine Struktur mit Feldern, die Default nicht implementieren, fehlschlagen?
Ja, derive(Default) funktioniert nur, wenn alle Felder der Struktur Default implementieren.
Default für Typen, bei denen der Standardwert unsicher oder sinnlos ist (z. B. für File, NetworkSocket).Default, wo eine explizite Initialisierung mit Parametern erforderlich ist.derive(Default) für eine Struktur mit nicht-standardmäßigen oder validierenden Wertregeln.Config mit Default, bei dem der Serverport 0 ist (ungültiger Standardwert). Das Programm startet unerwartet nicht auf dem richtigen Port.
Vorteile:
Nachteile:
Default für eine Struktur mit Einstellungen, die sichere, konsensuale Werte haben (retries=3, verbose=false).
Vorteile:
Nachteile: