Default trait

Default trait 用于返回一个类型的默认值, 其定义如下:

#![allow(unused)]
fn main() {
pub trait Default: Sized {
    // Required method
    fn default() -> Self;
}
}

Rust 里的基础数据类型都实现了这个 trait, 比如布尔类型的默认值是 false:

default_impl! { bool, false, "Returns the default value of `false`" }

其它常用类型的默认值列举如下表如示:

类型默认值
boolfalse
i80
i160
i320
i640
i1280
isize0
u80
u160
u320
u640
u1280
usize0
f320.0
f640.0
char\x00
unit()
sliceempty
strepmty
Option<T>None
Stringempty

Struct

对于自定义的结构体, 如果结构体内部的元素都实现了 Default trait, 那只需要让该结构体 derive Default, 比如:

#![allow(unused)]
fn main() {
#[derive(Default)]
pub struct Point {
  x: f32,
  y: f32,
}
}

以上定义的 Point 结构体, 同时实现了 Default trait. 等同于手动编写的代码:

#![allow(unused)]
fn main() {
pub struct Point {
    x: f32,
    y: f32,
}

impl Default for Point {
  fn default() -> Self {
      Self {
          x: f32::default(),
          y: f32::default(),
      }
  }
} 
}

对于一个实现了 Default trait 的结构体, 在创建该结构体实例时, 可以只手动指定某具元还给, 然后调用 Default::default() 方法用默认值补全剩下的元素:

#![allow(unused)]

fn main() {
#[derive(Default)]
pub struct Point {
    x: f32,
    y: f32,
}

impl Point {
    #[inline]
    #[must_use]
    pub fn from_x(x: f32) -> Self {
        Self {
            x,
            ..Default::default()
        }
    }
}
}

Enum

对于枚举类, 可以通过 #[default] 标签属性来指定哪个值是默认的, 看下面的示例代码:

#![allow(unused)]
fn main() {
#[derive(Default)]
pub enum Color {
    #[default]
    Primary,
    Secondary,
    Success,
    Info,
    Warning,
    Error,
    Inherit,
}
}