[為你自己學 Rust] 列舉(Enum)

[為你自己學 Rust] 列舉(Enum)

在寫程式的時候,雖然對電腦來說都是 0 跟 1,但對身為開發者的人類來說有好的命名或識別是很重要的,對自己好,對跟你一起工作的夥伴也好。

這個章節要介紹的「列舉(Enum)」並不是什麼很新或很特別的設計,在其它程式語言也常見,列舉是用來表示某種特定類型的值集合,通常會要把同樣類型的東西放在一起(例如顏色 Color),並且給它個名字(RedGreenBlue)。在程式碼裡使用 Enum 的時候比較不會因為不小心打錯字而造成錯誤,同時程式碼的可讀性也會比較好。

但 Rust 的 Enum 功能除了把項目列出來之外,還有一些其它程式語言的 Enum 所沒有的。

[為你自己學 Rust] 特徵(Trait)

[為你自己學 Rust] 特徵(Trait)

各位看到現在,都還是在學習 Rust 這個程式語言的語法,就算知道 Stack 與 Heap 的差別,也大概了解所有權跟生命週期是怎麼運作的,但如果現在要各位動手寫點程式的話,我猜大概還是不知道怎麼下手。不用太擔心,我也是。

本書前半段的內容主要是希望大家先熟悉 Rust 的設計跟語法,不求馬上就寫出什麼厲害的程式。這個章節要跟大家介紹的主題是「特徵(Trait)」,Trait 在 Rust 裡很常出現,如果能夠理解 Trait 的用途跟語法,應該就更能看懂其它人寫的程式碼或甚至是 Rust 本身的原始碼。

[為你自己學 Rust] 生命週期(Lifetime)

[為你自己學 Rust] 生命週期(Lifetime)

在前面的「所有權(Ownership)」章節曾經介紹 Rust 是如何透過所有權的轉讓與出借,來決定是否要釋放不再使用的記憶體空間,但其實在介紹所有權的時候,我們有省略了一些東西。

Rust 有「借(Borrow)」的設計,不需要複製整份資料,只要用 & 做個參照或切片,就能透過參照直接取用原本的資料。但是想像一下,如果我做了一個 Slice 指向某個 Vector,萬一那個 Vector 因為某些因素被放掉了,那麼這個 Slice 會參照到什麼東西?原本指向的記憶體位置讓出來之後假設運氣好沒有被其它資料佔用的話,也許有機會拿回來,但萬一被其它資料佔用了呢?Rust 編譯器為了確保程式可以正確執行,所以不會允許這種懸空參照(dangling reference)可能造成的不確定性,在編譯階段就會直接被擋下來。

所以如果要正常運作的話,被指到的 Vector 就不能比參照它的 Slice 還早消失對吧。Rust 的編譯器有一個 Borrow Checker(以下簡稱 BC)的設計,它會檢查參照的生命週期,如果 Rust 編譯器發現參照的資料的生命週期比較短,也就是會比較早消失,編譯就不會通過。雖然 BC 的檢查可能會有點囉嗦甚至難理解,但它可以避免常見的像是「釋放後使用(use-after-free)」或「雙重釋放(double-free)」的記憶體問題,也是它被說是比較「安全」的原因。

[為你自己學 Rust] 結構(Struct)

[為你自己學 Rust] 結構(Struct)

除了先前介紹過的 Array、Tuple 以及 Vector 之外,在 Rust 裡還有個很常用的資料結構叫做「結構(Struct)」。因為 Struct 這個字本身就是「結構」的意思,為了避免「在 Rust 裡結構是一種資料結構」這樣看起來有點奇怪的句字,以下我就用 Struct 原文就好。

[為你自己學 Rust] 切片(Slice)

[為你自己學 Rust] 切片(Slice)

在上個章節提到可以使用 & 或是 &mut 的方式去借(Borrow)資源來用,因為是借來的所以資源的「所有權(Ownership)」不會改變。在上個章節我用「圖書館借書」的比喻其實有些不太精準,就以「借書」這個行為來比喻沒問題,不過圖書館的書不管能不能被劃線(mutable),因為實體物理限制的關係一次也只能借給一個人,但以 Rust 裡的 Vector 來說沒這種物理限制,只要是 immutable 的話一次可以出借給許多人,唯一的規定就是一次只能有一個 mutable 的參照。

在 Rust 裡「借」東西的時候,有時候候並不需要參照到整塊資料,也許只需要其中的一小塊,Rust 也可以讓你借一小片就好,這正是這個章節想跟大家介紹的,切片(Slice)。

[為你自己學 Rust] 所有權(Ownership)

[為你自己學 Rust] 所有權(Ownership)

前面幾個章節老實說只要有寫過一陣子程式的網站工程師,大概稍微對照一下語法基本上不會太難學,但從這個章節開始可能會有些不同。「所有權(Ownership)」的設計有點特別,沒意外的話,這可能是網站工程師學習 Rust 的時候第一個遇到的門檻,我不知道各位,但至少對我這種沒有天生神力的一般工程師來說就是個門檻。

[為你自己學 Rust] Stack 與 Heap

[為你自己學 Rust] Stack 與 Heap

這個章節跟 Rust 比較沒直接關連,比較像是計算機概論的科普時間。這個章節我們要跟大家介紹關於記憶體的 Stack 與 Heap。通常 Stack 中文會翻譯成「堆疊」,而 Heap 會翻譯成「堆積」,但我覺得中文翻譯好像沒比較容易懂,所以我們這裡就用英文原文就好。

[為你自己學 Rust] 函數

[為你自己學 Rust] 函數

在別的程式語言裡,我相信各位應該都寫過函數或是用過別人寫的函數,但在開始介紹語法之前,我想先問大家一個很簡單的問題:

什麼是函數(function)?

大家是否曾想過這個問題?還是因為學校老師或是書上說要寫函數就是 function 給它寫下去,還有什麼參數、回傳值什麼的...。我上課的時候很愛問同學們「為什麼」,例如「為什麼要寫函數?」這個問題,我大多會得到差不多是「因為可以重複使用」之類的答案。是沒錯啦,函數可以重複使用的確是使用函數的好處之一。那麼到底什麼是函數?