网站首页

人工智能P2P分享搜索全网发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

rust语言基础学习: Default trait

时间:2023-05-22 16:16

人气:

作者:admin

标签: 学习  语言基础  Rust  Defaul 

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

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]属性实现
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信