Default
トレイト
説明
Rustの多くの型には コンストラクタ があります。しかし、これはその型 固有 のものです。Rustは「 new()
メソッドを持つものすべて」を抽象化することはできません。これを可能にするために、Default
特性が考案され、コンテナや他のジェネリック型と一緒に使用できます(例えば、Option::unwrap_or_default()
を参照してください)。注目すべきは、いくつかのコンテナは、適用可能な場合、すでにこれを実装していることです。
Cow
、Box
、Arc
のような1要素のコンテナが、その内包する型が Default
であるなら、 Default
を実装する、というだけではありません。すべてのフィールドが Default
を実装している構造体に対して #[derive(Default)]
が自動導出可能です。より多くの型が Default
を実装すればするほどより便利になります。
コンストラクタは複数の引数を取ることができる一方、 default()
メソッドではできません。またコンストラクタは異なる名称のものを複数定義することもできますが、 Default
の実装は1つの型につき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); }
See also
- constructor イディオムは、インスタンスを生成する別の方法だが、そのインスタンスは「デフォルト」かそうでないかを問わない。
Default
のドキュメント(実装しているもののリストは下にスクロールしてください)。Option::unwrap_or_default()
derive(new)