【Rust】 Default トレイト

blog1.mammb.com


Default トレイト

std::default::Default トレイトの実装により、型に応じた自明なデフォルト値を提供できる。

std::default::Default トレイトは以下のような定義となっている。

pub trait Default: Sized {
    fn default() -> Self;
}

例えば、String は以下のように Default を実装している。

impl Default for String {
    fn default() -> String {
        String::new()
    }
}

以下のようにデフォルト値を取得できる(std::default::Defaultは prelude から自動的にインポートされる)。

let s1: String = Default::default();
let s2 = String::default();

Rust の多くの型が Default トレイトを実装している。 コレクション型はdefault メソッドで空のコレクションを返す。

タプルの全ての要素が Default を実装していれば、そのタプルもDefault を実装していることになり、各要素のデフォルト値を保持したタプルをデフォルト値として取得できる。

ある型TDefault を実装していれば、Rc<T>Arc<T>Box<T>Cell<T>RefCell<T>Cow<T>Mutex<T>RwLock<T>Default が実装される。


構造体のすべてのフィールドが Default を実装していれば、#[derive(Default)] により自動的に Default を実装させることができる。

#[derive(Default)]
struct SomeOptions {
    foo: i32,
    bar: f32,
}

fn main() {
    let options = SomeOptions::default();
}

デフォルト値は部分的に上書きすることができる。

fn main() {
    let options = SomeOptions { foo: 42, ..Default::default() };
}


enum のデフォルト値は以下のように #[default] で設定できる。

#[derive(Default)]
enum Kind {
    #[default]
    A,
    B,
    C,
}

これは以下と同等です。

impl Default for Kind {
    fn default() -> Self { Kind::A }
}