物件導向程式設計 (Object-Oriented Programming) 目前仍然是最主流的編程範式 (Programming Paradigm),因此 Rust 也提供了物件導向程式語言最核心的幾項功能:封裝、繼承、多型。然而,在 Rust 中定義成員函式的語法與 C++ 有段差距,它的物件模型與實現繼承的方法也明顯異於 C++ 或大多數主流的物件導向程式語言。在這篇文章中,我將會詳細說明在 Rust 中實現物件導向的方法。
物件導向程式設計 (Object-Oriented Programming) 目前仍然是最主流的編程範式 (Programming Paradigm),因此 Rust 也提供了物件導向程式語言最核心的幾項功能:封裝、繼承、多型。然而,在 Rust 中定義成員函式的語法與 C++ 有段差距,它的物件模型與實現繼承的方法也明顯異於 C++ 或大多數主流的物件導向程式語言。在這篇文章中,我將會詳細說明在 Rust 中實現物件導向的方法。
在絕大多數的程式語言中,在 heap 上配置記憶體都是一項不可或缺的功能。由於存在 stack 上的物件有固定的生命週期,若要建立出像是二元樹 (binary tree) 或連結串列 (linked list) 之類的資料結構,就勢必要把物件配置在 heap 上。
在 Rust 中當然也可以在 heap 上配置物件,但為了正確管理記憶體資源,Rust 不允許你直接取得物件在 heap 上的裸指標 (raw pointer)。相反地,只要直接產生智慧指標 (smart pointer),Rust 就會在 heap 上配置適當的空間、初始化物件、並且把記憶體位址包裝在智慧指標內。
在這篇文章中,我將會介紹在 Rust 中不同的智慧指標,以及它們使用上與 C++ 的相同與相異之處。
在前面幾篇與 Rust 相關的文章中,我一直還沒提到的程式語言基本功能,就是字串與陣列了。若少了這兩項功能,很難做出什麼具備複雜功能的軟體。另一方面,為了達到記憶體安全,Rust 對參考型別設下了重重限制,讓你很難在物件中直接儲存指向另一個物件的參考。對此,Rust 也提供了智慧指標 (smart pointers),讓你可以方便地建立資料結構。
幸運的是,在字串、陣列與智慧指標的設計上,Rust 與 C++ 可說是驚人地相似。這篇文章將會從 C++ 的角度,帶你快速了解 Rust 所提供的功能。
在上一篇文章中,我們看到了在 Rust 中使用參考的方法,以及 mutable / immutable borrow 的規則。在這篇文章中,我會說明 Rust 如何避免懸置參考造成的記憶體存取錯誤。
|
|
在詳細說明這套規則之前,我想要先提出幾個案例進行思考:有些是我們想允許的功能,有些是我們想禁止的危險動作。在看過這些案例後,我們會比較容易理解為何 Rust 會設計出這套規則。
大多數的程式語言,為了有效率地傳遞、修改物件內容,會提供指標或參考型別 (reference type)。若某個變數是參考型別,意味著它並不直接儲存物件的內容,而是儲存記憶體位址,該位址指向的記憶體區塊才是真正儲存物件內容的地方。
除了快速傳遞大型物件外,參考型別也在一些語言功能上扮演重要角色,比如說:
作為追求執行效率的系統程式語言,Rust 也提供了參考型別,但是為了達成 memory safe 的目標,Rust 加上了一層嚴格的保護:borrow checker,讓它有著異常陡峭的學習曲線。本系列文章會試著從 borrow checker 的設計目標開始,解釋參考型別帶來的潛在危險,以及 borrow checker 如何幫我們檔下這些錯誤。
Rust 是最近受到廣泛注目的新語言。最早由 Mozilla 資助開發,後來因為 Dropbox 使用 Rust 改寫檔案系統服務[1]而聲明大噪。目前 Rust 是很活躍的開源專案,有超過一千名開發者共同開發,大約一至兩個月就會有一次 minor release。
設計程式語言最困難的地方在於選擇,沒有一個語言是上山下海無所不能的,而 Rust 也不例外。Rust 的目標是成為高效率、易於平行運算的系統程式語言,因此它選擇了以下的特性:
因此,對於習慣主流程式語言的使用者來說,Rust 的學習曲線非常陡峭,光是要讓程式碼通過編譯就要花上不少時間。接下來這一系列的文章,是以 C++ 使用者為對象,介紹 Rust 的各種語言功能以及背後的設計目標,希望各位可以看得很愉快。
常常聽到有些人誤解了 weak typing 的意義,或是對 C 語言同時是 static typed 與 weak typed 感到疑惑,因此提出一些我自己的想法。
我們先從 type checker 說起吧。
近來嘗試在公司架設 WPA-Enterprise 無線網路,並讓使用者利用 LDAP 帳號登入。由於過程高潮迭起,不做個筆記就太可惜了。