最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust實(shí)現(xiàn)面向?qū)ο蟮姆椒?/h1>
 更新時間:2022年10月24日 11:24:28   作者:微涼秋意  
這篇文章主要介紹了Rust實(shí)現(xiàn)面向?qū)ο蟮姆椒?Rust?并不是面向?qū)ο蟮恼Z言,但是面向?qū)ο蟮墓δ芏伎梢酝ㄟ^自身的特點(diǎn)來實(shí)現(xiàn),本文通過示例代碼給大家詳細(xì)講解,需要的朋友可以參考下

前言

面向?qū)ο蟮木幊陶Z言通常實(shí)現(xiàn)了數(shù)據(jù)的封裝繼承并能基于數(shù)據(jù)調(diào)用方法。“設(shè)計(jì)模式四個小幫手”在《設(shè)計(jì)模式》中給出面向?qū)ο蟮亩x:面向?qū)ο蟮某绦蛴蓪ο蠼M成,對象包裝了數(shù)據(jù)和操作這些數(shù)據(jù)的過程,這些過程通常被稱作方法或操作。Rust 并不是面向?qū)ο蟮恼Z言,但是面向?qū)ο蟮墓δ芏伎梢酝ㄟ^自身的特點(diǎn)來實(shí)現(xiàn)。

1、實(shí)現(xiàn)封裝(pub)

調(diào)用對象外部的代碼無法直接訪問對象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),唯一可以與對象進(jìn)行交互的方法就是通過它公開的 API,在Rust 中使用 pub關(guān)鍵字來供外部訪問。

封裝的示例:

pub struct AveragedCollection{
    list:Vec<i32>,
    average:f64
}

impl AveragedCollection{
    pub fn add(&mut self,value:i32){
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self)->Option<i32>{
        let result=self.list.pop();
        match result {
            Some(value)=>{
                self.update_average();
                Some(value)
            },
            None=>None
        }
    }

    pub fn average(&self)->f64{
        self.average
    }

    fn update_average(&mut self){
        let total:i32=self.list.iter().sum();
        self.average=total as f64 / self.list.len() as f64;
    }
}

代碼解釋:

  • 結(jié)構(gòu)體 AveragedCollection 含有l(wèi)ist動態(tài)集合與average 兩個變體
    • 結(jié)構(gòu)體被pub修飾,可以被外部訪問,但是兩個變體不可以被訪問
    • 兩個變體的修改交給下面定義的其他pub修飾的方法
  • add與remove 完成list集合的元素添加與刪除,默認(rèn)調(diào)用封裝的更新方法
  • update_average 用來更新平均數(shù),而average方法被pub修飾,外部可以直接訪問平均數(shù)

由此示例可知 Rust 結(jié)構(gòu)體等類型默認(rèn)是私有的,相當(dāng)于C++/Java中的private,而被pub修飾后相當(dāng)于public,合理利用這些關(guān)鍵字可以做到封裝的效果。

2、實(shí)現(xiàn)繼承(trait)

繼承可以使對象沿用另外一個對象的數(shù)據(jù)和行為,無需定義相關(guān)代碼,代碼復(fù)用效率高。Rust 中不存在繼承,但是可以通過 trait 方法來實(shí)現(xiàn)代碼共享,且可以在 trait 中覆蓋定義的方法,這就相當(dāng)于主流語言中的子類繼承父類與重寫父類方法。

2.1、為共有行為定義一個 Trait

Rust 避免將 structenum 稱為對象,因?yàn)樗鼈兣cimpl塊是分開的。

  • trait對象有些類似于其它語言中的對象:
    • 它們某種程度上組合了數(shù)據(jù)與行為
  • trait 對象與傳統(tǒng)對象不同的地方:
    • 無法為 trait對象添加數(shù)據(jù)
  • trait對象被專門用于抽象某些共有行為,它沒其它語言中的對象那么通用

2.2、Trait 對象執(zhí)行的是動態(tài)派發(fā)

  • 將trait約束作用于泛型時,Rust編譯器會執(zhí)行單態(tài)化:
    • 編譯器會為我們用來替換泛型類型參數(shù)的每一個具體類型生成對應(yīng)函數(shù)和方法的非泛型實(shí)現(xiàn)
  • 通過單態(tài)化生成的代碼會執(zhí)行靜態(tài)派發(fā)(static dispatch),在編譯過程中確定調(diào)用的具體方法
  • 動態(tài)派發(fā)(dynamic dispatch) :
    • 無法在編譯過程中確定你調(diào)用的究竟是哪一種方法
    • 編譯器會產(chǎn)生額外的代碼以便在運(yùn)行時找出希望調(diào)用的方法
  • 使用trait 對象,會執(zhí)行動態(tài)派發(fā):
    • 產(chǎn)生運(yùn)行時開銷
    • 阻止編譯器內(nèi)聯(lián)方法代碼,使得部分優(yōu)化操作無法進(jìn)行

2.3、Trait對象必須保證對象安全

  • 只能把滿足對象安全(object-safe)的 trait 轉(zhuǎn)化為 trait 對象。
  • Rust采用一系列規(guī)則來判定某個對象是否安全,只需記住兩條:
    • 方法的返回類型不是Self
    • 方法中不包含任何泛型類型參數(shù)

3、實(shí)現(xiàn)多態(tài)(結(jié)合泛型)

繼承是多態(tài)(Polymorphism)思想的實(shí)現(xiàn),多態(tài)指的是編程語言可以處理多種類型數(shù)據(jù)的代碼,在 Rust中使用泛型trait 約束(限定參數(shù)化多態(tài) bounded parametric)模擬多態(tài)的使用。

有關(guān)Rust 泛型與特性的知識在本專欄前面已經(jīng)介紹過,幫大家放個鏈接:Rust 泛型與特性

4、面向?qū)ο蟮脑O(shè)計(jì)模式

狀態(tài)模式(state pattern)是一種面向?qū)ο笤O(shè)計(jì)模式:

  • 一個值擁有的內(nèi)部狀態(tài)由數(shù)個狀態(tài)對象(state object)表達(dá)而成,而值的行為則隨著內(nèi)
  • 部狀態(tài)的改變而改變
  • 使用狀態(tài)模式意味著:
    • 業(yè)務(wù)需求變化時,不需要修改持有狀態(tài)的值的代碼,或者使用這個值的代碼
    • 只需要更新狀態(tài)對象內(nèi)部的代碼,以便改變其規(guī)則。或者增加一些新的狀態(tài)對象
  • 狀態(tài)模式的缺點(diǎn):
    • 某些狀態(tài)之間是相互耦合的
    • 需要重復(fù)實(shí)現(xiàn)一些邏輯代碼

Rust不僅能夠?qū)崿F(xiàn)面向?qū)ο蟮脑O(shè)計(jì)模式,還可以支持更多的模式,例如:
將狀態(tài)和行為編碼為類型:
Rust 類型檢查系統(tǒng)會通過編譯時錯誤來阻止用戶使用無效的狀態(tài)。

面向?qū)ο蟮慕?jīng)典模式并不總是Rust編程實(shí)踐中的最佳選擇,因?yàn)镽ust具有所有權(quán)等其它面向?qū)ο笳Z言沒有的特性!

到此這篇關(guān)于Rust實(shí)現(xiàn)面向?qū)ο蟮姆椒ǖ奈恼戮徒榻B到這了,更多相關(guān)Rust面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust?語言println!?宏的格式占位符詳解

    Rust?語言println!?宏的格式占位符詳解

    這篇文章主要介紹了Rust語言的println!宏的格式占位符,這只是格式說明符的一部分清單,Rust?的格式化系統(tǒng)非常靈活和強(qiáng)大,支持更多的選項(xiàng)和組合,需要的朋友可以參考下
    2024-03-03
  • Rust中vector的詳細(xì)用法

    Rust中vector的詳細(xì)用法

    Rust和C++同樣也有vector概念,本文主要介紹了Rust中vector的詳細(xì)用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 如何使用rust實(shí)現(xiàn)簡單的單鏈表

    如何使用rust實(shí)現(xiàn)簡單的單鏈表

    實(shí)現(xiàn)單鏈表在別的語言里面可能是一件簡單的事情,單對于Rust來說,絕對不簡單,下面這篇文章主要給大家介紹了關(guān)于如何使用rust實(shí)現(xiàn)簡單的單鏈表的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • rust?創(chuàng)建多線程web?server的詳細(xì)過程

    rust?創(chuàng)建多線程web?server的詳細(xì)過程

    web?server?中主要的兩個協(xié)議是?http?和?tcp,tcp?是底層協(xié)議,http?是構(gòu)建在?tcp?之上的,本篇文章重點(diǎn)給大家介紹rust?創(chuàng)建多線程web?server的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 深入了解Rust?結(jié)構(gòu)體的使用

    深入了解Rust?結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個不同的類型組合成一個整體。下面我們就來學(xué)習(xí)如何定義和使用結(jié)構(gòu)體,并對比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下
    2022-11-11
  • rust中trait的使用方法詳解

    rust中trait的使用方法詳解

    trait用中文來講就是特征,它就是一個標(biāo)記,只不過這個標(biāo)記被用在特定的地方,也就是類型參數(shù)的后面,下面我們就來學(xué)習(xí)一下trait的具體使用方法吧
    2023-12-12
  • Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中有三個重要的組織概念:箱、包、模塊,本文主要介紹了Rust中箱、包和模塊的學(xué)習(xí)筆記,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • vscode搭建rust開發(fā)環(huán)境的圖文教程

    vscode搭建rust開發(fā)環(huán)境的圖文教程

    本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Rust使用lettre實(shí)現(xiàn)郵件發(fā)送功能

    Rust使用lettre實(shí)現(xiàn)郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了Rust如何使用lettre實(shí)現(xiàn)郵件發(fā)送功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Rust中自定義Debug調(diào)試輸出的示例詳解

    Rust中自定義Debug調(diào)試輸出的示例詳解

    這篇文章主要介紹了Rust中自定義Debug調(diào)試輸出的示例詳解,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評論

和田县| 永济市| 武平县| 上杭县| 原阳县| 德清县| 安丘市| 宁明县| 泰来县| 河西区| 洛川县| 祁东县| 盘锦市| 六盘水市| 阜城县| 垣曲县| 永仁县| 霞浦县| 工布江达县| 绥化市| 班玛县| 宜阳县| 曲松县| 东宁县| 郁南县| 奈曼旗| 余姚市| 绥江县| 古交市| 洪泽县| 南康市| 日土县| 南澳县| 西和县| 土默特左旗| 凤冈县| 宜君县| 通州区| 光泽县| 得荣县| 黑水县|