Default トレイト
説明
Rustの多くの型にはコンストラクタがあります。しかし、これは型に固有のものです。Rustは「new()メソッドを持つすべてのもの」を抽象化することはできません。これを可能にするためにDefaultトレイトが考案されました。これはコンテナやその他のジェネリック型で使用できます(例:Option::unwrap_or_default()を参照)。特に、一部のコンテナは該当する場合にすでにこれを実装しています。
Cow、Box、Arcのような単一要素のコンテナが、含まれる型がDefaultを実装している場合にDefaultを実装するだけでなく、すべてのフィールドがDefaultを実装している構造体に対して自動的に#[derive(Default)]できます。そのため、より多くの型がDefaultを実装するほど、より便利になります。
一方で、コンストラクタは複数の引数を取ることができますが、default()メソッドは引数を取りません。異なる名前を持つ複数のコンストラクタを持つことさえできますが、型ごとにDefaultの実装は1つしか持てません。
例
use std::{path::PathBuf, time::Duration}; // note that we can simply auto-derive Default here. #[derive(Default, Debug, PartialEq)] struct MyConfiguration { // Option defaults to None output: Option<PathBuf>, // Vecs default to empty vector search_path: Vec<PathBuf>, // Duration defaults to zero time timeout: Duration, // bool defaults to false check: bool, } impl MyConfiguration { // add setters here } fn main() { // construct a new instance with default values let mut conf = MyConfiguration::default(); // do something with conf here conf.check = true; println!("conf = {conf:#?}"); // partial initialization with default values, creates the same instance let conf1 = MyConfiguration { check: true, ..Default::default() }; assert_eq!(conf, conf1); }
参照
- コンストラクタイディオムは、「デフォルト」である場合とそうでない場合があるインスタンスを生成する別の方法です
Defaultドキュメント(実装者のリストについては下にスクロールしてください)Option::unwrap_or_default()derive(new)