Default トレイト
説明
Rust の多くの型にはコンストラクターがあります。しかし、これは型に
固有のものです。Rust は「new() メソッドを持つすべてのもの」を抽象化できません。
これを可能にするために、Default トレイトが考案されました。これはコンテナーや
その他のジェネリック型で使用できます(例として Option::unwrap_or_default() を参照)。
特に、一部のコンテナーは適用可能な場合にすでにこれを実装しています。
Cow、Box、Arc のような 1 要素コンテナーは、格納される型が Default を
実装している場合に Default を実装するだけではありません。すべてのフィールドが
Default を実装している構造体では #[derive(Default)] を自動的に使用できるため、
Default を実装する型が増えるほど、より有用になります。
一方で、コンストラクターは複数の引数を取ることができますが、default() メソッドは
そうではありません。異なる名前を持つコンストラクターが複数存在することさえありますが、
型ごとに存在できる Default 実装は 1 つだけです。
例
use std::{path::PathBuf, time::Duration};
// ここでは単に Default を自動導出できることに注意してください。
#[derive(Default, Debug, PartialEq)]
struct MyConfiguration {
// Option のデフォルトは None
output: Option<PathBuf>,
// Vec のデフォルトは空のベクター
search_path: Vec<PathBuf>,
// Duration のデフォルトはゼロ時間
timeout: Duration,
// bool のデフォルトは false
check: bool,
}
impl MyConfiguration {
// ここにセッターを追加する
}
fn main() {
// デフォルト値で新しいインスタンスを構築する
let mut conf = MyConfiguration::default();
// ここで conf に対して何かを行う
conf.check = true;
println!("conf = {conf:#?}");
// デフォルト値による部分的な初期化。同じインスタンスを作成する
let conf1 = MyConfiguration {
check: true,
..Default::default()
};
assert_eq!(conf, conf1);
}
関連項目
- コンストラクター イディオムは、「デフォルト」である場合もそうでない場合もある インスタンスを生成するもう 1 つの方法です
Defaultドキュメント(実装している型の一覧を見るには下にスクロールしてください)Option::unwrap_or_default()derive(new)