衡阳派盒市场营销有限公司

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

    瀏覽量

    8070
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3028
收藏 人收藏

    評論

    相關推薦

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

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

    基于Rust語言Hash特征的基礎用法和進階用法

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

    Rust語言中的反射機制

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

    Rust語言如何與 InfluxDB 集成

    Rust 是一種系統級編程語言,具有高性能和內存安全性。InfluxDB 是一個開源的時間序列數據庫,用于存儲、查詢和可視化大規模數據集。Rust 語言可以與 InfluxDB 集成,
    的頭像 發表于 09-30 16:45 ?1239次閱讀

    基于Rust語言中的生命周期

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

    Rust中的From和Into trait的基礎使用方法和進階用法

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

    Rust 語言中的 RwLock內部實現原理

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

    如何用 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 ?835次閱讀

    以調試Rust的方式來學習Rust

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

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

    Borrow和BorrowMut traitRust標準庫std:borrow 模塊中用于處理借用數據的trait,通過實現Borrow 和BorrowMut trait可以讓一個
    的頭像 發表于 05-22 15:57 ?955次閱讀

    rust語言基礎學習: 智能指針之Cow

    Rust中與借用數據相關的三個trait: Borrow, BorrowMut和ToOwned。理解了這三個trait之后,再學習Rust
    的頭像 發表于 05-22 16:13 ?3007次閱讀

    實現Rust Trait類型 那么該類型的引用也實現了trait嗎?

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

    適合嵌入式設備開發的編程語言Rust語言

    Rust語言是二十一世紀的語言新星。Rust被人廣泛承認的一點,就是因為它能運行在多樣的目標上,從桌面和服務器設備,到資源有限的嵌入式設備。
    發表于 09-12 09:39 ?3141次閱讀
    適合嵌入式設備開發的編程<b class='flag-5'>語言</b>—<b class='flag-5'>Rust</b><b class='flag-5'>語言</b>
    玩百家乐官网怎么才能赢| 大发888优惠代码| 百家乐网站出售| 百家乐官网决战推筒子| 战神国际| 威尼斯人娱乐网站怎么样| 大发888官方下载168| 百家乐专业术语| 免费百家乐官网追号软件| 菲律宾百家乐官网娱乐网| 大发888 大发娱乐城| 赌百家乐可以赢钱| 百家乐硬币打法| 合乐8百家乐官网娱乐城| 百家乐官网网上赌博| 大发888 bet娱乐场下载| 马牌百家乐的玩法技巧和规则| 关于百家乐概率的书| 现场百家乐官网的玩法技巧和规则 | 真人百家乐官网是啥游戏| 88真人娱乐城| 百家乐平玩法lm0| 首席百家乐官网的玩法技巧和规则| 太阳城百家乐官网分析解码| 平陆县| 皇冠现金网娱乐城| 棋牌游戏网| 威尼斯人娱乐城网上百家乐| 澳门百家乐怎洋赢钱| 玩百家乐会犯法吗| 百家乐官网德州扑克桌布| 百家乐官网网上真钱赌场娱乐网规则 | 澳门百家乐官网必赢技巧| 现金百家乐官网技巧| 百家乐官网娱乐城注册| 百家乐官网分析软体| 天天乐娱乐城官网| bet365开户| 脉动棋牌下载| 大发888认识的见解| 全讯网体育|