Historique de la question :
Rust adhère à la philosophie de l'initialisation explicite. Pour certaines collections standard et certains types génériques, il est souvent nécessaire d'avoir une valeur "par défaut". Cependant, pour des structures complexes, il est souvent ambigu de savoir comment les créer sans paramètres. À cette fin, le trait Default a été introduit, qui définit un constructeur standard.
Problème :
Pour écrire des conteneurs et des algorithmes universels où l'on s'attend parfois à une valeur par défaut (par exemple, dans Option::unwrap_or_default, Vec::resize), un mécanisme de création d'instances sans passer d'arguments est nécessaire. Mais tous les types ne conviennent pas pour ce type de constructeur ; parfois, la valeur par défaut peut être non évidente et dangereuse.
Solution :
default() qui retourne une certaine instance (généralement "vide", mise à zéro ou avec des préconditions).Exemple de code :
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Caractéristiques clés :
Le Default::default sera-t-il appelé automatiquement pour Option<T>, si T : Default ?
Non, Optional n'appelle pas par défaut default pour T automatiquement ; unwrap_or_default est appelé explicitement.
Les paramètres avec une valeur par défaut peuvent-ils être définis via le trait Default dans le constructeur d'une structure ?
Non, Default crée toute la structure dans son ensemble, les champs individuels par défaut ne peuvent pas être remplacés par la syntaxe classique du constructeur.
Le derive(Default) peut-il échouer pour une structure avec des champs n'implémentant pas Default ?
Oui, derive(Default) fonctionne uniquement si tous les champs de la structure implémentent Default.
Config c Default, où le port du serveur est 0 (valeur par défaut invalide). Le programme démarre de manière inattendue sur un port incorrect.
Avantages :
Inconvénients :
Default pour une structure de configuration avec des valeurs sûres et consensuelles (retries=3, verbose=false).
Avantages :
Inconvénients :