Default 特性

说明

Rust中的许多类型都有一个构造器。 但这些构造器都是针对特定类型的,Rust没有抽象出一个对所有类型适用的new()方法。 因此Default 特性trait应运而生,它适用于容器containers或者其他泛型类型generic types (例如Option::unwrap_or_default()) 值得注意的是,一些容器containers已经实现了Default特性。

不仅单例容器如Cow, BoxArc 实现了Default, 使用#[derive(Default)]可以自动为所含字段实现了Default的结构体structs实现Default。 所以越多的类型支持Default`,它就会越有用。

然而,构造器可以用不同的参数去构建实例,但default()不行。 我们可以定义多个不同的构造器去构造实例,但是Default的只能有一种实现。

例子

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

// 这里我们可以很方便地自动实现 Default
#[derive(Default, Debug, PartialEq)]
struct MyConfiguration {
    // Option类型默认为 None
    output: Option<PathBuf>,
    // Vecs类型默认为空 vector
    search_path: Vec<PathBuf>,
    // Duration类型默认为0
    timeout: Duration,
    // bool类型默认为 false
    check: bool,
}

impl MyConfiguration {
    // 这里添加 setters
}

fn main() {
    // 用默认值构建一个实例
    let mut conf = MyConfiguration::default();
    // 改动一些键值
    conf.check = true;
    println!("conf = {:#?}", conf);
        
    // 用部分初始化partial initialization进行初始化
    let conf1 = MyConfiguration {
        check: true,
        ..Default::default()
    };
    assert_eq!(conf, conf1);
}

参见