欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

前言

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

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

調(diào)用對(duì)象外部的代碼無(wú)法直接訪問(wèn)對(duì)象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),唯一可以與對(duì)象進(jìn)行交互的方法就是通過(guò)它公開(kāi)的 API,在Rust 中使用 pub關(guān)鍵字來(lái)供外部訪問(wè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動(dòng)態(tài)集合與average 兩個(gè)變體
    • 結(jié)構(gòu)體被pub修飾,可以被外部訪問(wèn),但是兩個(gè)變體不可以被訪問(wèn)
    • 兩個(gè)變體的修改交給下面定義的其他pub修飾的方法
  • add與remove 完成list集合的元素添加與刪除,默認(rèn)調(diào)用封裝的更新方法
  • update_average 用來(lái)更新平均數(shù),而average方法被pub修飾,外部可以直接訪問(wèn)平均數(shù)

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

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

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

2.1、為共有行為定義一個(gè) Trait

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

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

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

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

2.3、Trait對(duì)象必須保證對(duì)象安全

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

    Rust?語(yǔ)言println!?宏的格式占位符詳解

    這篇文章主要介紹了Rust語(yǔ)言的println!宏的格式占位符,這只是格式說(shuō)明符的一部分清單,Rust?的格式化系統(tǒng)非常靈活和強(qiáng)大,支持更多的選項(xiàng)和組合,需要的朋友可以參考下
    2024-03-03
  • C和Java沒(méi)那么香了,Serverless時(shí)代Rust即將稱王?

    C和Java沒(méi)那么香了,Serverless時(shí)代Rust即將稱王?

    Serverless Computing,即”無(wú)服務(wù)器計(jì)算”,其實(shí)這一概念在剛剛提出的時(shí)候并沒(méi)有獲得太多的關(guān)注,直到2014年AWS Lambda這一里程碑式的產(chǎn)品出現(xiàn)。Serverless算是正式走進(jìn)了云計(jì)算的舞臺(tái)
    2021-06-06
  • Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景解析

    Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景解析

    Rust?是一種強(qiáng)調(diào)安全性和速度的系統(tǒng)編程語(yǔ)言,這篇文章主要介紹了Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Rust?Atomics?and?Locks?源碼解讀

    Rust?Atomics?and?Locks?源碼解讀

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks?源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Rust中引用的具體使用

    Rust中引用的具體使用

    在Rust語(yǔ)言中,引用機(jī)制是其所有權(quán)系統(tǒng)的重要組成部分,ust提供了兩種類型的引用,不可變引用和可變引用,本文就來(lái)詳細(xì)的介紹一下這兩種的用法,感興趣的可以了解一下
    2024-03-03
  • 如何使用Rust直接編譯單個(gè)的Solidity合約

    如何使用Rust直接編譯單個(gè)的Solidity合約

    本文介紹了如何使用Rust語(yǔ)言直接編譯Solidity智能合約,特別適用于沒(méi)有外部依賴或flatten后的合約,一般情況下,Solidity開(kāi)發(fā)者使用Hardhat或Foundry框架,本文給大家介紹如何使用Rust直接編譯單個(gè)的Solidity合約,感興趣的朋友一起看看吧
    2024-09-09
  • Rust 枚舉和模式匹配的實(shí)現(xiàn)

    Rust 枚舉和模式匹配的實(shí)現(xiàn)

    枚舉是 Rust 中非常重要的復(fù)合類型,也是最強(qiáng)大的復(fù)合類型之一,廣泛用于屬性配置、錯(cuò)誤處理、分支流程、類型聚合等場(chǎng)景中,本文就來(lái)介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下
    2023-12-12
  • Rust語(yǔ)言之使用Polar權(quán)限管理方法詳解

    Rust語(yǔ)言之使用Polar權(quán)限管理方法詳解

    權(quán)限管理 (Permission Management) 是一個(gè)涵蓋了系統(tǒng)或網(wǎng)絡(luò)中用戶權(quán)限控制和管理的系統(tǒng),本文將詳細(xì)給大家介紹Rust語(yǔ)言中如何使用Polar權(quán)限管理,需要的朋友可以參考下
    2023-11-11
  • Rust?Postgres實(shí)例代碼

    Rust?Postgres實(shí)例代碼

    Rust Postgres是一個(gè)純Rust實(shí)現(xiàn)的PostgreSQL客戶端庫(kù),本文主要介紹了Rust?Postgres實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • rust的nutyp驗(yàn)證和validator驗(yàn)證數(shù)據(jù)的方法示例詳解

    rust的nutyp驗(yàn)證和validator驗(yàn)證數(shù)據(jù)的方法示例詳解

    本文介紹了在Rust語(yǔ)言中,如何使用nuType和validator兩種工具來(lái)對(duì)Cargo.toml和modules.rs文件進(jìn)行驗(yàn)證,通過(guò)具體的代碼示例和操作步驟,詳細(xì)解釋了驗(yàn)證過(guò)程和相關(guān)配置,幫助讀者更好地理解和掌握使用這兩種驗(yàn)證工具的方法,更多Rust相關(guān)技術(shù)資訊,可繼續(xù)關(guān)注腳本之家
    2024-09-09

最新評(píng)論