Rust中的三種多態(tài)性——枚舉+結(jié)構(gòu)體(下)

0x00 回顧與開篇

多態(tài)性(Polymorphism)在很多語言中都存在或油,比如Java/C#等腐巢。有了編程語言的多態(tài)性會使我們在工作中更加靈活和方便。當(dāng)然桐筏,Rust也有多態(tài)性的特點范抓。在Rust中有三種主要方法來實現(xiàn)多態(tài)骄恶,我們的目的就是討論每種方法的優(yōu)缺點。上一篇文章介紹了Trait的兩種方式尉咕。今天咱們一起來看最后一種方式——Enum+Struct叠蝇。

0x01 Enum + Struct

廢話不多說,直接上代碼年缎。

enum ShapeEnum {
    Rectangle(Rectangle),
    Triangle(Triangle),
    Circle(Circle)
}

struct Rectangle { pub width: f32, pub height: f32 }
struct Triangle { pub side: f32 }
struct Circle { pub radius: f32 }

trait Shape {
    fn perimeter(&self) -> f32;
    fn area(&self) -> f32;
}

impl Shape for ShapeEnum {
    fn perimeter(&self) -> f32 {
        match self {
            ShapeEnum::Rectangle(rect) => rect.perimeter(),
            ShapeEnum::Triangle(tri) => tri.perimeter(),
            ShapeEnum::Circle(circ) => circ.perimeter(),
        }
    }
    fn area(&self) -> f32 {
        match self {
            ShapeEnum::Rectangle(rect) => rect.area(),
            ShapeEnum::Triangle(tri) => tri.area(),
            ShapeEnum::Circle(circ) => circ.area(),
        }
    }
}

impl Shape for Rectangle {
    fn perimeter(&self) -> f32 {
        self.width * 2.0 + self.height * 2.0
    }
    fn area(&self) -> f32 {
        self.width * self.height
    }
}

impl Shape for Triangle {
    fn perimeter(&self) -> f32 {
        self.side * 3.0
    }
    fn area(&self) -> f32 {
        self.side * 0.5 * 3.0_f32.sqrt() / 2.0 * self.side
    }
}

impl Shape for Circle {
    fn perimeter(&self) -> f32 {
        self.radius * 2.0 * std::f32::consts::PI
    }
    fn area(&self) -> f32 {
        self.radius * self.radius * std::f32::consts::PI
    }
}

這種寫法悔捶,在我看來應(yīng)該是比較不錯的一種了。但是它有個缺點单芜,每當(dāng)你需要添加新的變量和方法時蜕该,需要在很多地方添加代碼。其它為自己的結(jié)構(gòu)體實現(xiàn) Shapecrate 將無法將它們傳遞給 ShapeEnum洲鸠,維護比較麻煩堂淡。

0x02 推薦使用一種方式?

在這里扒腕,我們通過一個表格來對比下以上三種方式優(yōu)缺點吧绢淀。(表格僅供參考)

內(nèi)聯(lián)布局 不浪費內(nèi)存 混合類型集合 擴展性 易于編寫和維護
枚舉 ? ? ? ? ?
Trait泛型 ? ? ? ? ?
Trait動態(tài) ? ? ? ? ?
枚舉+結(jié)構(gòu)體 ? ? ? ? ?

上面的表格僅代表個人看法。在工作中瘾腰,如果變量很小皆的,已知,有限且沒有給其它人提供 crate 的需要蹋盆。我還是比較建議使用枚舉费薄。另外,動態(tài)調(diào)度還是比較推薦使用的栖雾,即使它的性能較低楞抡,但大多數(shù)時候它仍然表現(xiàn)的還是不錯的。當(dāng)然泛型在很多語言中都存在析藕,如果你熟悉了Java/C#等面向?qū)ο蟮恼Z言召廷,我也是比較推薦的。

0x03 小結(jié)

我通過3篇文章啰里啰嗦的介紹了Rust中實現(xiàn)多態(tài)的3種方式≈簦可能讀到這里数初,有些同學(xué)還在糾結(jié)我應(yīng)該使用哪種方式找爱。其實梗顺,在我們平時的大多數(shù)情況下使用哪一種并不重要,選擇自己喜歡的并且適合自己所應(yīng)用的場景就可以了车摄,并不要被別人的任何言論所束縛寺谤,除非你真的是非要擠出那一點性能,我認為Rust的性能已經(jīng)足夠好了吮播。

最近工作比較繁忙变屁,更新有些慢,望大家見諒了意狠!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粟关,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子环戈,更是在濱河造成了極大的恐慌闷板,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院塞,死亡現(xiàn)場離奇詭異遮晚,居然都是意外死亡,警方通過查閱死者的電腦和手機拦止,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門县遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汹族,你說我怎么就攤上這事萧求。” “怎么了顶瞒?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵夸政,是天一觀的道長。 經(jīng)常有香客問我搁拙,道長秒梳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任箕速,我火速辦了婚禮酪碘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盐茎。我一直安慰自己兴垦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著探越,像睡著了一般狡赐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钦幔,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天枕屉,我揣著相機與錄音,去河邊找鬼鲤氢。 笑死搀擂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卷玉。 我是一名探鬼主播哨颂,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼相种!你這毒婦竟也來了威恼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤寝并,失蹤者是張志新(化名)和其女友劉穎箫措,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體食茎,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蒂破,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了别渔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片附迷。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哎媚,靈堂內(nèi)的尸體忽然破棺而出喇伯,到底是詐尸還是另有隱情,我是刑警寧澤拨与,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布稻据,位于F島的核電站,受9級特大地震影響买喧,放射性物質(zhì)發(fā)生泄漏捻悯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一淤毛、第九天 我趴在偏房一處隱蔽的房頂上張望今缚。 院中可真熱鬧,春花似錦低淡、人聲如沸姓言。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何荚。三九已至囱淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間餐塘,已是汗流浹背妥衣。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唠倦,地道東北人称鳞。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓涮较,卻偏偏與公主長得像稠鼻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狂票,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容