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 避免將 struct
或 enum
稱為對(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)文章
-
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?是一種強(qiáng)調(diào)安全性和速度的系統(tǒng)編程語(yǔ)言,這篇文章主要介紹了Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下 2024-03-03
-
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的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)論
前言
面向?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 避免將 struct
或 enum
稱為對(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)文章
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-06Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景解析
Rust?是一種強(qiáng)調(diào)安全性和速度的系統(tǒng)編程語(yǔ)言,這篇文章主要介紹了Rust?語(yǔ)言中符號(hào)?::?的使用場(chǎng)景,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03Rust語(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-11rust的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