Rust的物件導向(一) 結構體

2021-10-23 20:19:43 字數 2433 閱讀 5732

從2023年c語言主體完成到2023年c++正式命名,10年的時間,程式設計理念經歷了一次從面向過程到物件導向的蛻變。資料的組織形式也從struct到class得到了昇華。自那以後,幾乎所有語言的類都是class,相當一部分程式設計師知道怎麼用class卻不能準確說出來物件導向是什麼。然而,go和rust卻同時站出來說:「我們不需要class。」頓時,全場靜音。

事實上,物件導向的概念早在2023年的simula語言中就開始提出來了,比c語言的面世還早了6年。可是時至今日,全網也找不到乙個權威的物件導向的定義,有的都是用會意的方式來解釋什麼是物件導向。

相比物件導向抽象的定義而言,物件導向的三要素卻是非常具體的,它們是:

封裝很好理解,就是定義類的屬性和方法,並且提供訪問級別來控制其它類的物件是否可以訪問它們。rust雖然沒有類,但可以使用結構體或列舉來定義屬性,並為結構體或列舉附加方法來實現。

而繼承是類之間的關係,因為沒有類,rust和go都沒有繼承的概念。不過rust巧妙的用泛型以及泛型的特性實現了一套與繼承相類似的**共享機制。

多型是建立在繼承之上的,它允許在使用父類的地方使用子類,rust的特性也擁有類似的能力。

在學習rust的物件導向之前,需要充分意識到接下來要學習的東西與你之前認識的世界有著天壤之別,不要被過去的知識所束縛,退一步,進入乙個嶄新的世界。

學習rust的物件導向是乙個漫長的過程,裡面要掌握的知識非常多,我們可以使用下面的路線圖來學習rust的物件導向:

建立結構體或列舉

為結構體或列舉實現方法

為結構體或列舉實現特性

rust似乎退回到了c語言的時代,使用struct來組織資料,它的結構體分為三種:

rust的一般結構體與c語言的結構體非常相似,直接上例子:

struct staff 

fn main() ;

println!("staff1:");

println!("id: {}, name: {}, email: {}, department: {}, manager_id: {}",

staff1.id, staff1.name, staff1.email, staff1.department, staff1.manager_id

);let staff2 = staff ;

println!("staff2:");

println!("id: {}, name: {}, email: {}, department: {}, manager_id: {}",

staff2.id, staff2.name, staff2.email, staff2.department, staff2.manager_id

);}

對於上面的例子,staff2的department和manager_id與staff1相同,當然可以把staff1的這兩個字段複製過來:

let staff2 = staff ;
可是rust怎麼會允許這麼麻煩的事情存在,捷徑必須有啊:

let staff2 = staff ;
上面**的第5行,就可以從staff1中複製剩餘的字段,夠簡潔吧。

如果我們要通過乙個函式來建立結構體物件呢:

struct staff 

fn main() , name: {}, email: {}, department: {}, manager_id: {}",

staff1.id, staff1.name, staff1.email, staff1.department, staff1.manager_id

);}fn get_staff(id: u8, name: string, email: string, department: string, manager_id: u8) -> staff

}

還是那句話,get_staff函式裡這麼寫太麻煩了,捷徑,我要捷徑:

fn get_staff(id: u8, name: string, email: string, department: string, manager_id: u8) -> staff 

}

有一些結構體,每個欄位都有約定俗成的定義,比如顏色有r、g、b,點有x、y,還叫不上名字來的,比如ip位址的四個部分。這些比較適合使用元組結構體進行儲存,元組結構體與元組類似,只是多了乙個型別名稱:

struct ipaddr(u8, u8, u8, u8);

fn main() .{}.{}.{}", ip.0, ip.1, ip.2, ip.3);

}

有沒有那麼一首歌,會讓你輕輕跟著和。不對不對,有沒有那麼一種結構體,它本身什麼欄位也沒有?rust的答案是肯定的,這就是類單元結構體。它有什麼用?它就相當於乙個類,沒有任何成員變數,只有一些成員函式。結構體能有成員函式?這個可以有,但不要著急,學完列舉咱們再討論。

Rust的物件導向(四) 為結構體或列舉實現特性

從1973年c語言主體完成到1983年c 正式命名,10年的時間,程式設計理念經歷了一次從面向過程到物件導向的蛻變。資料的組織形式也從struct到class得到了昇華。自那以後,幾乎所有語言的類都是class,相當一部分程式設計師知道怎麼用class卻不能準確說出來物件導向是什麼。然而,go和ru...

Rust學習 結構體

討論元組和結構體,比較 對比 如何定義和例項化結構體 如何定義關聯函式 一 結構體 使用struct 關鍵字宣告 struct user 例項可變可以使用點號修改結構體某個字段。rust不允許只將乙個不可變的結構體中某個字段標記為可變。元組結構體 1.給元組命名 2.使元組成為與其他元組不同的型別 ...

Go 物件導向之結構體

說明 1.將一類事物的特性提取出來 比如貓類 形成乙個新的資料型別就是乙個結構體 2.通過這個結構體,可以建立多個變數 例項 物件 3.事物可以是貓類,也可以是其它的類.案例 package main import fmt 定義乙個結構體,類似於類 將cat 的各個字段 屬性,放入到結構體中 typ...