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

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

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

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

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

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

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

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

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

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

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

    #[derive(Default)]為類型自動實現(xiàn)Default trait。

  • 手動實現(xiàn)Default trait:impl Defalut for A

  • 枚舉的#[default]屬性

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

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

#[derive(Debug)],

pub enum PayStatus {
Unpaid,
Paid,
}

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

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

}

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

}

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

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

Default trait 使用

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

當類型實現(xiàn)了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 的結(jié)果。

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
    }
}

總結(jié)

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

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

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

    關(guān)注

    0

    文章

    4

    瀏覽量

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

    關(guān)注

    0

    文章

    57

    瀏覽量

    3009
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    Rust語言中的反射機制

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

    Rust語言如何與 InfluxDB 集成

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

    基于Rust語言中的生命周期

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

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

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

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

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

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

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

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

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

    trait中使用 `async fn`

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

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

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

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

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

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

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

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

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

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

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