Rust 入門程式設計/列舉
假設我們正在儲存構成一個角的三個點,並且我們希望在一個結構體中跟蹤有關它的某些屬性。 我們想在結構體中跟蹤哪些屬性? 好吧,我們可以儲存三個點的 x 和 y 位置,它們之間的角度。 假設我們還想儲存它是哪種型別的角度。 提醒一下:銳角小於 90 度,直角正好是 90 度,鈍角大於 90 度但小於 180 度,而反角大於 180 度。 如何儲存這些不同的狀態? 一個簡單的方法可能是為每個狀態分配一個數字。 例如,0 是銳角,1 是直角,2 是鈍角,3 是反角。 讓我們看看它是如何工作的
struct Points {
point1: (f64, f64),
point2: (f64, f64),
point3: (f64, f64),
angle: f64,
angle_type: u8,
}
現在我們必須記住哪個數字對應於哪種角度型別。 此外,還可能數字被設定為無效的角度型別,而型別系統的意義在於確保值只能是那些有意義且有效的。 這在目的上失敗了。 這就是列舉的其中一個原因!
列舉(列舉型別的簡稱)是一種表示某事物可能處於多個不同狀態中的其中一種的方式。 例如,一個玩家角色可能處於空閒、奔跑或跳躍狀態。 一張圖片可能處於動畫或靜態狀態。 等等。 在這裡,我們定義列舉如下
enum AngleType {
Acute,
Right,
Obtuse,
Reflex,
}
現在,我們可以將其放入我們的結構體中,如下所示
struct Points {
point1: (f64, f64),
point2: (f64, f64),
point3: (f64, f64),
angle: f64,
angle_type: AngleType,
}
我們這樣使用它
fn main() {
let points = Points {
point1: (1.0, 2.0),
point2: (1.0, 1.0),
point3: (2.0, 1.0),
angle: 90.0,
angle_type: AngleType::Right,
};
}
請注意,我們必須非常詳細地寫出來,明確地表示它是 AngleType 型別的 Right。 Rust 的一個重要特點是,有時它鼓勵非常清晰地寫出事物,即使這樣寫起來需要更長的時間。 這是由於一些程式設計規則
- 程式碼被閱讀的次數比被編寫的次數更多
- 程式碼比閱讀更容易編寫
- 更短的型別和變數名稱通常不像更長的名稱那樣全面地解釋事物
所有這些意味著從長遠來看,在編寫程式碼時花時間可以節省以後的時間。
現在我們可以使用普通的 == 運算子檢查列舉是否是我們期望的型別。 例如:
fn is_angle_right(points: Points) -> bool {
points.angle_type == AngleType::Right
}
等等,返回語句在哪裡? 為什麼它沒有以分號結尾? 好吧,因為我們通常希望擁有簡短的函式,如果我們使用隱式返回,就可以節省時間,在隱式返回中,我們省略分號,以便語句自動返回。 正常的規則適用,因此語句的型別必須與函式的返回型別匹配。 這很有用,但也可能難以理解,因此在您認為有意義的地方使用它。
關於 Rust 列舉的另一個優點是,由於不同的狀態可能與不同的資料相關聯,因此我們可以在這些型別中儲存資料。 例如,假設我們想新增一個布林值,以表示該角度是否與軸線對齊。 這隻有對於直角才有意義,因此我們可以像這樣新增該布林值
enum AngleType {
Acute,
Right(bool),
Obtuse,
Reflex,
}
但是我們如何從列舉中獲取值? 這就是模式匹配的作用