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) Shape
的 crate
將無法將它們傳遞給 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)足夠好了吮播。
最近工作比較繁忙变屁,更新有些慢,望大家見諒了意狠!