系列文章目錄
【跟小嘉學(xué) Rust 編程】一、Rust 編程基礎(chǔ)
【跟小嘉學(xué) Rust 編程】二、Rust 包管理工具使用
【跟小嘉學(xué) Rust 編程】三、Rust 的基本程序概念
【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念
【跟小嘉學(xué) Rust 編程】五、使用結(jié)構(gòu)體關(guān)聯(lián)結(jié)構(gòu)化數(shù)據(jù)
【跟小嘉學(xué) Rust 編程】六、枚舉和模式匹配
【跟小嘉學(xué) Rust 編程】七、使用包(Packages)、單元包(Crates)和模塊(Module)來(lái)管理項(xiàng)目
【跟小嘉學(xué) Rust 編程】八、常見(jiàn)的集合
【跟小嘉學(xué) Rust 編程】九、錯(cuò)誤處理(Error Handling)
【跟小嘉學(xué) Rust 編程】十一、編寫(xiě)自動(dòng)化測(cè)試
【跟小嘉學(xué) Rust 編程】十二、構(gòu)建一個(gè)命令行程序
【跟小嘉學(xué) Rust 編程】十三、函數(shù)式語(yǔ)言特性:迭代器和閉包
【跟小嘉學(xué) Rust 編程】十四、關(guān)于 Cargo 和 Crates.io
【跟小嘉學(xué) Rust 編程】十五、智能指針(Smart Point)
【跟小嘉學(xué) Rust 編程】十六、無(wú)畏并發(fā)(Fearless Concurrency)
【跟小嘉學(xué) Rust 編程】十七、面向?qū)ο笳Z(yǔ)言特性
前言
本章節(jié)講解面向?qū)ο蟮奶卣鳎约斑@些特征如何轉(zhuǎn)化為 Rust。
主要教材參考 《The Rust Programming Language》
一、 面向?qū)ο笳Z(yǔ)言特性
1.1、對(duì)象包含數(shù)據(jù)(Data)和行為(Behavior)
面向?qū)ο蟮某绦蛴蓪?duì)象組成,對(duì)象包含了數(shù)據(jù)和操作這些數(shù)據(jù)的過(guò)程,這些過(guò)程通常被稱為方法或操作。
基于此定義,Rust 是面向?qū)ο蟮摹?Struct、emun包含數(shù)據(jù),impl 塊為之提供了方法,但是帶有方法的 Struct、 enum 并沒(méi)被稱為對(duì)象。
1.2、封裝隱藏實(shí)現(xiàn)細(xì)節(jié)
封裝:調(diào)用對(duì)象外部的代碼無(wú)法直接訪問(wèn)對(duì)象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),唯一可以與對(duì)象進(jìn)行交互的方法就是通過(guò)它公開(kāi)的API。
Rust 里面使用 pub 公開(kāi)數(shù)據(jù)或方法,默認(rèn)是私有的。
1.3、繼承和代碼復(fù)用
繼承:使對(duì)象可以沿用另外一個(gè)對(duì)象的數(shù)據(jù)和行為,且無(wú)需重復(fù)定義相關(guān)代碼。
Rust 沒(méi)有繼承。
使用繼承的原因:
- 代碼復(fù)用:Rust 使用 Trait方法來(lái)進(jìn)行代碼共享
- 多態(tài):Rust 使用泛型 和 trait 約束(限定參數(shù)化多態(tài) bounded parametric)
二、使用 trait 對(duì)象存儲(chǔ)不同類型的值
2.1、為共有行為定義為一個(gè) trait
pub trait Draw{
fn draw(&self);
}
2.2、動(dòng)態(tài)派發(fā)(dynamic dispatch):和靜態(tài)派發(fā)(static dispatch)
Trait 對(duì)象執(zhí)行的是動(dòng)態(tài)派發(fā),將Trait約束作用于泛型,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)行。
trait 對(duì)象必須保證對(duì)象安全
2.3、Trait 對(duì)象必須保證對(duì)象安全
只能把滿足對(duì)象安全的trait 轉(zhuǎn)化 trait 對(duì)象
Rust 采用一系列規(guī)則來(lái)判定某個(gè)對(duì)象是否安全,只需要記住兩條
- 方法的返回類型不是 Self
- 方法中不包含任何泛型類型參數(shù)
三、實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)模式
3.1、狀態(tài)模式(state pattern)
狀態(tài)模式是一種面向?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ī)則或增加一些新的狀態(tài)對(duì)象
3.2、示例代碼
pub struct Post {
state: Option<Box<dyn State>>,
content: String,
}
impl Post {
pub fn new() -> Post {
Post {
state: Some(Box::new(Draft {})),
content: String::new(),
}
}
pub fn add_text(&mut self, text: &str) {
self.content.push_str(text);
}
pub fn content(&self) -> &str {
self.state.as_ref().unwrap().content(self)
}
pub fn request_review(&mut self) {
if let Some(s) = self.state.take() {
self.state = Some(s.request_review())
}
}
}
trait State {
fn request_review(self: Box<Self>) -> Box<dyn State>;
fn content<'a>(&self, post: &'a Post) -> &'a str {
""
}
}
struct Draft {}
impl State for Draft {
fn request_review(self: Box<Self>) -> Box<dyn State> {
Box::new(PendingReview {})
}
}
struct PendingReview {}
impl State for PendingReview {
fn request_review(self: Box<Self>) -> Box<dyn State> {
self
}
}
struct Published {}
impl State for Published {
fn request_review(self: Box<Self>) -> Box<dyn State> {
self
}
fn approve(self: Box<Self>) -> Box<dyn State> {
self
}
fn content<'a>(&self, post: &'a Post) -> &'a str {
&post.content
}
}
缺點(diǎn)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-684777.html
- 某些狀態(tài)之間是相互耦合的
- 需要重復(fù)實(shí)現(xiàn)一些邏輯代碼
3.3、
總結(jié)
以上就是今天要講的內(nèi)容文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-684777.html
到了這里,關(guān)于【跟小嘉學(xué) Rust 編程】十七、面向?qū)ο笳Z(yǔ)言特性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!