0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rust语言基础学习: Default trait

冬至子 来源:山川与湖海 作者:山川与湖海 2023-05-22 16:16 次阅读

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]属性实现
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Default
    +关注

    关注

    0

    文章

    4

    浏览量

    8040
  • rust语言
    +关注

    关注

    0

    文章

    57

    浏览量

    3009
收藏 人收藏

    评论

    相关推荐

    聊聊Rust与C语言交互的具体步骤

    rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产。本期通过几个例子来聊聊
    发表于 07-06 11:15 1701次阅读

    基于Rust语言Hash特征的基础用法和进阶用法

    ,包括Hash trait、HashMap、HashSet等,本教程将详细介绍Rust语言Hash特征的基础用法和进阶用法。 基础用法 使用Hash trait
    的头像 发表于 09-19 16:02 1431次阅读

    Rust语言中的反射机制

    Rust语言的反射机制指的是在程序运行时获取类型信息、变量信息等的能力。Rust语言中的反射机制主要通过 Any 实现。 std::any::Any
    的头像 发表于 09-19 16:11 2389次阅读

    Rust语言如何与 InfluxDB 集成

    Rust 是一种系统级编程语言,具有高性能和内存安全性。InfluxDB 是一个开源的时间序列数据库,用于存储、查询和可视化大规模数据集。Rust 语言可以与 InfluxDB 集成,
    的头像 发表于 09-30 16:45 1147次阅读

    基于Rust语言中的生命周期

    Rust是一门系统级编程语言具备高效、安和并发等特,而生命周期是这门语言中比较重要的概念之一。在这篇教程中,我们会了解什么是命周期、为什么需要生命周期、如何使用生命周期,同时我们依然会使用老朋友
    的头像 发表于 09-19 17:03 895次阅读

    Rust中的From和Into trait的基础使用方法和进阶用法

    、可靠和安全的系统级应用的首选语言Rust中的From和Into是两个重要的trait,它们可以帮助我们进行类型转换。From trait允许我们从一个类型转换到另一个类型,而In
    的头像 发表于 09-20 10:55 1771次阅读

    Rust 语言中的 RwLock内部实现原理

    Rust是一种系统级编程语言,它带有严格的内存管理、并发和安全性规则,因此很受广大程序员的青睐。RwLock(读写锁)是 Rust 中常用的线程同步机制之一,本文将详细介绍 Rust
    的头像 发表于 09-20 11:23 860次阅读

    如何用 rust 语言开发 stm32

    本文介绍如何用 rust 语言开发 stm32。开发平台为 linux(gentoo)。硬件准备本文使用的芯片为 STM32F103C8T6。该芯片性价比较高,价格低廉,适合入门学习。需要
    发表于 11-26 06:20

    如何利用C语言去调用rust静态库呢

    语言的感觉,要做不少的对接工作。也用过Lua,感觉也差不多。评估学习评估Rust语言时,感觉性能和体积应该都不会有太大的问题。加上语言本身
    发表于 06-21 10:27

    trait中使用 `async fn`

    { ... } } 更多请看官方blog:https://blog.rust-lang.org/inside-rust/2022/11/17/async-fn-in-trait-nightly.html 社区受
    的头像 发表于 11-23 15:40 778次阅读

    以调试Rust的方式来学习Rust

    在我上一篇 关于 Rustup 的文章 中,我向你们展示了如何安装 Rust 工具链。但是,如果不能上手操作一下 Rust 的话下载工具链又有什么用?学习任何语言都包括阅读现有的代码和
    的头像 发表于 01-03 14:56 903次阅读

    为什么Borrow和BorrowMut被定义为泛型trait呢?

    Borrow和BorrowMut traitRust标准库std:borrow 模块中用于处理借用数据的trait,通过实现Borrow 和BorrowMut trait可以让一个
    的头像 发表于 05-22 15:57 896次阅读

    rust语言基础学习: 智能指针之Cow

    Rust中与借用数据相关的三个trait: Borrow, BorrowMut和ToOwned。理解了这三个trait之后,再学习Rust
    的头像 发表于 05-22 16:13 2900次阅读

    实现Rust Trait类型 那么该类型的引用也实现了trait吗?

    如果你在一个类型上实现了一个trait,然后引用了这个类型,那么类型的引用也实现了这个trait吗?
    的头像 发表于 08-28 15:25 704次阅读

    适合嵌入式设备开发的编程语言Rust语言

    Rust语言是二十一世纪的语言新星。Rust被人广泛承认的一点,就是因为它能运行在多样的目标上,从桌面和服务器设备,到资源有限的嵌入式设备。
    发表于 09-12 09:39 2956次阅读
    适合嵌入式设备开发的编程<b class='flag-5'>语言</b>—<b class='flag-5'>Rust</b><b class='flag-5'>语言</b>