0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

rust語言基礎(chǔ)學(xué)習(xí): Default trait

冬至子 ? 來源:山川與湖海 ? 作者:山川與湖海 ? 2023-05-22 16:16 ? 次閱讀

Default trait 顧名思義是默認(rèn)值,即Rust為特定類型實(shí)現(xiàn) Default 特性時(shí),可以為該類型賦予了可選的默認(rèn)值。

使用Default trait為類型提供缺省值

Default trait 屬于std::default::Default ,先看一下它的定義:

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

比較簡(jiǎn)單,為類型實(shí)現(xiàn)Default trait的方式:

  • 如果類型中的包含的其他類型都實(shí)現(xiàn)了Default trait,就可以通過derive宏

    #[derive(Default)]為類型自動(dòng)實(shí)現(xiàn)Default trait。

  • 手動(dòng)實(shí)現(xiàn)Default trait:impl Defalut for A

  • 枚舉的#[default]屬性

  1. 通過derive宏#[derive(Default)]和手動(dòng)實(shí)現(xiàn)實(shí)現(xiàn)Default trait結(jié)合

// 假如unpaid和paid不實(shí)現(xiàn)defalut,則編譯無法通過

#[derive(Debug)],

pub enum PayStatus {
Unpaid,
Paid,
}

// 為枚舉PayStatus手工實(shí)現(xiàn)
impl Default for PayStatus {
fn default() -> Self {
PayStatus::Unpaid
}
}

// Price的所有字段類型都實(shí)現(xiàn)了Default, 因此可以derive Default
#[derive(Default, Debug)]
pub struct Price {
original_price: f64,
discounted_price: f64,

}

// Order的所有字段類型都實(shí)現(xiàn)了Default,因此可以derive Default
#[derive(Default, Debug)]
pub struct Order {
id: i64,
pay_status: PayStatus,
price: Price,

}

2.枚舉的#[default] 屬性 : enum 枚舉上使用 #[derive(Default)] 時(shí),可以通過在變體上放置 #[default] 屬性來簡(jiǎn)化實(shí)現(xiàn)。

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

Default trait 使用

Rust是非空類型的,類型需要初始化即賦值,如果沒有一個(gè)默認(rèn)值,需要寫大量冗余代碼給該類型賦初始值,這就需要一種簡(jiǎn)便的方式生成初始值,即Default trait, Rust 為各種原始類型實(shí)現(xiàn) Default。

當(dāng)類型實(shí)現(xiàn)了Default trait之后,在初始化時(shí),可以部分初始化,其余部分使用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

當(dāng)你在 Option 實(shí)例上使用 unwrap_or_default 方法時(shí), Default trait是必須的。如果 Option 是 None 的話, unwrap_or_default 方法將返回 T 類型的 Default::default 的結(jié)果。

struct Canvas;
enum Shape {
    Circle,
    Rectangle,
}


impl Canvas {
    // let user optionally pass a color
    // 用戶可選地傳入一個(gè) color
    fn paint(&mut self, shape: Shape, color: Option) {
        // if no color is passed use the default color
        // 若用戶沒有傳入 color ,即使用默認(rèn)的 color
        let color = color.unwrap_or_default();
        // etc
    }
}

總結(jié)

Default trait為類型提供缺省值,即幫你創(chuàng)建一個(gè)類型的默認(rèn)值。派生宏#[derive(Default)]意味著自動(dòng)實(shí)現(xiàn)了 default 函數(shù)。default 函數(shù)的派生實(shí)現(xiàn)調(diào)用了類型每部分的 default 函數(shù),這意味著類型中所有的字段也必須實(shí)現(xiàn)了Default trait 。

為自己的類型(比如結(jié)構(gòu)體,枚舉等)實(shí)現(xiàn)Default trait的方式:

  • 通過派生宏實(shí)現(xiàn)#[derive(Default)]
  • 通過手動(dòng)實(shí)現(xiàn) impl Defalut for A
  • 枚舉可以使用#[default]屬性實(shí)現(xiàn)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Default
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    8018
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    2993
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    聊聊Rust與C語言交互的具體步驟

    rust FFI 是rust與其他語言互調(diào)的橋梁,通過FFI rust 可以有效繼承 C 語言的歷史資產(chǎn)。本期通過幾個(gè)例子來聊聊
    發(fā)表于 07-06 11:15 ?1571次閱讀

    基于Rust語言Hash特征的基礎(chǔ)用法和進(jìn)階用法

    ,包括Hash trait、HashMap、HashSet等,本教程將詳細(xì)介紹Rust語言Hash特征的基礎(chǔ)用法和進(jìn)階用法。 基礎(chǔ)用法 使用Hash trait
    的頭像 發(fā)表于 09-19 16:02 ?1314次閱讀

    Rust語言中的反射機(jī)制

    Rust語言的反射機(jī)制指的是在程序運(yùn)行時(shí)獲取類型信息、變量信息等的能力。Rust語言中的反射機(jī)制主要通過 Any 實(shí)現(xiàn)。 std::any::Any
    的頭像 發(fā)表于 09-19 16:11 ?2141次閱讀

    Rust語言如何與 InfluxDB 集成

    Rust 是一種系統(tǒng)級(jí)編程語言,具有高性能和內(nèi)存安全性。InfluxDB 是一個(gè)開源的時(shí)間序列數(shù)據(jù)庫,用于存儲(chǔ)、查詢和可視化大規(guī)模數(shù)據(jù)集。Rust 語言可以與 InfluxDB 集成,
    的頭像 發(fā)表于 09-30 16:45 ?1027次閱讀

    基于Rust語言中的生命周期

    Rust是一門系統(tǒng)級(jí)編程語言具備高效、安和并發(fā)等特,而生命周期是這門語言中比較重要的概念之一。在這篇教程中,我們會(huì)了解什么是命周期、為什么需要生命周期、如何使用生命周期,同時(shí)我們依然會(huì)使用老朋友
    的頭像 發(fā)表于 09-19 17:03 ?831次閱讀

    Rust中的From和Into trait的基礎(chǔ)使用方法和進(jìn)階用法

    、可靠和安全的系統(tǒng)級(jí)應(yīng)用的首選語言。 Rust中的From和Into是兩個(gè)重要的trait,它們可以幫助我們進(jìn)行類型轉(zhuǎn)換。From trait允許我們從一個(gè)類型轉(zhuǎn)換到另一個(gè)類型,而In
    的頭像 發(fā)表于 09-20 10:55 ?1652次閱讀

    Rust 語言中的 RwLock內(nèi)部實(shí)現(xiàn)原理

    Rust是一種系統(tǒng)級(jí)編程語言,它帶有嚴(yán)格的內(nèi)存管理、并發(fā)和安全性規(guī)則,因此很受廣大程序員的青睞。RwLock(讀寫鎖)是 Rust 中常用的線程同步機(jī)制之一,本文將詳細(xì)介紹 Rust
    的頭像 發(fā)表于 09-20 11:23 ?772次閱讀

    如何用 rust 語言開發(fā) stm32

    本文介紹如何用 rust 語言開發(fā) stm32。開發(fā)平臺(tái)為 linux(gentoo)。硬件準(zhǔn)備本文使用的芯片為 STM32F103C8T6。該芯片性價(jià)比較高,價(jià)格低廉,適合入門學(xué)習(xí)。需要
    發(fā)表于 11-26 06:20

    如何利用C語言去調(diào)用rust靜態(tài)庫呢

    語言的感覺,要做不少的對(duì)接工作。也用過Lua,感覺也差不多。評(píng)估學(xué)習(xí)評(píng)估Rust語言時(shí),感覺性能和體積應(yīng)該都不會(huì)有太大的問題。加上語言本身
    發(fā)表于 06-21 10:27

    trait中使用 `async fn`

    { ... } } 更多請(qǐng)看官方blog:https://blog.rust-lang.org/inside-rust/2022/11/17/async-fn-in-trait-nightly.html 社區(qū)受
    的頭像 發(fā)表于 11-23 15:40 ?729次閱讀

    以調(diào)試Rust的方式來學(xué)習(xí)Rust

    在我上一篇 關(guān)于 Rustup 的文章 中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話下載工具鏈又有什么用?學(xué)習(xí)任何語言都包括閱讀現(xiàn)有的代碼和
    的頭像 發(fā)表于 01-03 14:56 ?855次閱讀

    為什么Borrow和BorrowMut被定義為泛型trait呢?

    Borrow和BorrowMut traitRust標(biāo)準(zhǔn)庫std:borrow 模塊中用于處理借用數(shù)據(jù)的trait,通過實(shí)現(xiàn)Borrow 和BorrowMut trait可以讓一個(gè)
    的頭像 發(fā)表于 05-22 15:57 ?816次閱讀

    rust語言基礎(chǔ)學(xué)習(xí): 智能指針之Cow

    Rust中與借用數(shù)據(jù)相關(guān)的三個(gè)trait: Borrow, BorrowMut和ToOwned。理解了這三個(gè)trait之后,再學(xué)習(xí)Rust
    的頭像 發(fā)表于 05-22 16:13 ?2798次閱讀

    實(shí)現(xiàn)Rust Trait類型 那么該類型的引用也實(shí)現(xiàn)了trait嗎?

    如果你在一個(gè)類型上實(shí)現(xiàn)了一個(gè)trait,然后引用了這個(gè)類型,那么類型的引用也實(shí)現(xiàn)了這個(gè)trait嗎?
    的頭像 發(fā)表于 08-28 15:25 ?639次閱讀

    適合嵌入式設(shè)備開發(fā)的編程語言Rust語言

    Rust語言是二十一世紀(jì)的語言新星。Rust被人廣泛承認(rèn)的一點(diǎn),就是因?yàn)樗苓\(yùn)行在多樣的目標(biāo)上,從桌面和服務(wù)器設(shè)備,到資源有限的嵌入式設(shè)備。
    發(fā)表于 09-12 09:39 ?2739次閱讀
    適合嵌入式設(shè)備開發(fā)的編程<b class='flag-5'>語言</b>—<b class='flag-5'>Rust</b><b class='flag-5'>語言</b>