← SEARCHABLE ARCHIVE
Rust · 2026-07-27

Rust 從基礎到精通 — 第 4 講

用結構和枚舉表達有效狀態

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

結構將相關資料分組,列舉列出可能的狀態。 如果將兩者一起使用,則不必強製表達欄位和布林值不能存在的組合。

結構及實現

struct Player {
    name: String,
    health: i32,
}

impl Player {
    fn new(name: impl Into<String>) -> Self {
        Self {
            name: name.into(),
            health: 100,
        }
    }

    fn take_damage(&mut self, amount: i32) {
        self.health = (self.health - amount.max(0)).max(0);
    }
}

impl 區塊定義了與結構相關的創建函數和方法。 &mut self 表示此方法獨佔借用來修改物件。

用枚舉表達狀態

enum QuestState {
    Locked,
    Active { progress: u32, goal: u32 },
    Completed { reward_claimed: bool },
}

只有在活躍時才會有進度,只有完成時才會收到獎勵。 與使用多個布林值和可為空白欄位表達相同資訊相比,無效組合減少了。

模式匹配

fn describe(state: &QuestState) -> String {
    match state {
        QuestState::Locked => String::from("Locked"),
        QuestState::Active { progress, goal } => {
            format!("{progress}/{goal}")
        }
        QuestState::Completed { reward_claimed: true } => {
            String::from("Reward claimed")
        }
        QuestState::Completed { reward_claimed: false } => {
            String::from("Reward ready")
        }
    }
}

match 檢查所有枚舉的情況是否都已處理。 新增狀態將導致未處理的程式碼顯示為編譯錯誤。

Option 和 Result 也是相同的枚舉。 在 Rust 中,狀態和失敗可能性被表示為類型,並且每種情況都使用匹配或專用方法來處理。