Default Trait

描述

Rust中的许多类型都有一个构造器。然而,这是类型特殊的;Rust不能抽象出“所有对象都具有new()方法”。 为了允许这一点,我们设想了Defaulttrait,它可以用于容器和其他泛型(例如,见Option::unwrap_or_default())。 值得注意的是,一些容器已经在适用的地方实现了它。

不仅像CowBoxArc这样的单元素容器为所包含的Default类型实现了 Default,人们还可以自动为字段都实现了Default的结构体实现#[derive(Default)],所以越多类型实现Default,它就越有用。

另一方面,构造器可以接受多个参数,而default()方法则不能。 甚至可以有多个名字不同的构造器,但每个类型只能有一个Default的实现。

例子

use std::{path::PathBuf, time::Duration};

// note that we can simply auto-derive Default here.
#[derive(Default, Debug, PartialEq)]
struct MyConfiguration {
    // Option defaults to None
    output: Option<PathBuf>,
    // Vecs default to empty vector
    search_path: Vec<PathBuf>,
    // Duration defaults to zero time
    timeout: Duration,
    // bool defaults to false
    check: bool,
}

impl MyConfiguration {
    // add setters here
}

fn main() {
    // construct a new instance with default values
    let mut conf = MyConfiguration::default();
    // do something with conf here
    conf.check = true;
    println!("conf = {:#?}", conf);
        
    // partial initialization with default values, creates the same instance
    let conf1 = MyConfiguration {
        check: true,
        ..Default::default()
    };
    assert_eq!(conf, conf1);
}

参见

Latest commit 9834f57 on 25 Aug 2021