rust语言基础学习: Default trait

电子说

1.3w人已加入

描述

Default trait 顾名思义是默认值,即Rust为特定类型实现 Default 特性时,可以为该类型赋予了可选的默认值。

使用Default trait为类型提供缺省值

Default trait 属于std::default::Default ,先看一下它的定义:

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

比较简单,为类型实现Default trait的方式:

  • 如果类型中的包含的其他类型都实现了Default trait,就可以通过derive宏

    #[derive(Default)]为类型自动实现Default trait。

  • 手动实现Default trait:impl Defalut for A

  • 枚举的#[default]属性

  1. 通过derive宏#[derive(Default)]和手动实现实现Default trait结合

// 假如unpaid和paid不实现defalut,则编译无法通过

#[derive(Debug)],

pub enum PayStatus {
Unpaid,
Paid,
}

// 为枚举PayStatus手工实现
impl Default for PayStatus {
fn default() -> Self {
PayStatus::Unpaid
}
}

// Price的所有字段类型都实现了Default, 因此可以derive Default
#[derive(Default, Debug)]
pub struct Price {
original_price: f64,
discounted_price: f64,

}

// Order的所有字段类型都实现了Default,因此可以derive Default
#[derive(Default, Debug)]
pub struct Order {
id: i64,
pay_status: PayStatus,
price: Price,

}

2.枚举的#[default] 属性 : enum 枚举上使用 #[derive(Default)] 时,可以通过在变体上放置 #[default] 属性来简化实现。

#[derive(Default)]
enum Kind {
    #[default]
    A,
    B,
    C,
}
 let kind = Kind::default();
 println!("{:?}", kind); // A

Default trait 使用

Rust是非空类型的,类型需要初始化即赋值,如果没有一个默认值,需要写大量冗余代码给该类型赋初始值,这就需要一种简便的方式生成初始值,即Default trait, Rust 为各种原始类型实现 Default。

当类型实现了Default trait之后,在初始化时,可以部分初始化,其余部分使用Default::default()初始化。

fn main() {
   let order1 = Order::default();
   let order2 = Order {
       id: 100,
       ..Order::default()
   };
   println!("order1 = {:?}", order1);
   println!("order2 = {:?}", order2);
}

在泛型编程的语境中,Default trait也可显其威力和方便性

fn guarantee_length

当你在 Option 实例上使用 unwrap_or_default 方法时, Default trait是必须的。如果 Option 是 None 的话, unwrap_or_default 方法将返回 T 类型的 Default::default 的结果。

struct Canvas;
enum Shape {
    Circle,
    Rectangle,
}


impl Canvas {
    // let user optionally pass a color
    // 用户可选地传入一个 color
    fn paint(&mut self, shape: Shape, color: Option) {
        // if no color is passed use the default color
        // 若用户没有传入 color ,即使用默认的 color
        let color = color.unwrap_or_default();
        // etc
    }
}

总结

Default trait为类型提供缺省值,即帮你创建一个类型的默认值。派生宏#[derive(Default)]意味着自动实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段也必须实现了Default trait 。

为自己的类型(比如结构体,枚举等)实现Default trait的方式:

  • 通过派生宏实现#[derive(Default)]
  • 通过手动实现 impl Defalut for A
  • 枚举可以使用#[default]属性实现
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分