Storia della questione:
Rust aderisce alla filosofia della inizializzazione esplicita. Per alcune collezioni standard e tipi generici è spesso necessario avere un valore "di default". Tuttavia, per strutture complesse può essere difficile capire come crearle senza parametri. A questo scopo è stato introdotto il trait Default, che definisce un costruttore standard.
Problema:
Per scrivere contenitori e algoritmi generici, dove a volte è atteso un valore di default (ad esempio, in Option::unwrap_or_default, Vec::resize), è necessario un meccanismo per creare un'istanza senza passare argomenti. Ma non tutti i tipi sono adatti per un tale costruttore; a volte il valore di default può essere poco chiaro e pericoloso.
Soluzione:
default(), che restituisce un'istanza (di solito "vuota", zeroed o con precondizioni).Esempio di codice:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Caratteristiche chiave:
Verrà forzatamente chiamato Default::default per Option<T>, se T: Default?
No, Optional non chiama automaticamente default per T; unwrap_or_default viene chiamato esplicitamente.
Possono i parametri con valore di default essere impostati tramite il trait Default nel costruttore della struttura?
No, Default crea l'intera struttura; i campi singoli di default non possono essere sostituiti con la normale sintassi del costruttore.
Può derive(Default) rompersi per una struttura con campi che non implementano Default?
Sì, derive(Default) funziona solo se tutti i campi della struttura implementano Default.
Config c Default, dove la porta del server è 0 (valore non valido di default). Il programma si avvia inaspettatamente su una porta sbagliata.
Pro:
Contro:
Default per una struttura di configurazione con valori sicuri e consensuali (retries=3, verbose=false).
Pro:
Contro: