Default トレイト

説明

Rustの多くの型には コンストラクタ があります。しかし、これはその型 固有 のものです。Rustは「 new() メソッドを持つものすべて」を抽象化することはできません。これを可能にするために、Default 特性が考案され、コンテナや他のジェネリック型と一緒に使用できます(例えば、Option::unwrap_or_default() を参照してください)。注目すべきは、いくつかのコンテナは、適用可能な場合、すでにこれを実装していることです。

CowBoxArc のような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)
Last change: 2024-07-09, commit: 317c88e