← 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 中,状态和失败可能性被表示为类型,并且每种情况都使用匹配或专用方法来处理。