Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Default トレイト

説明

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

CowBoxArc のような 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);
}

関連項目