Learn Rust Coding · 课时

定义您的第一个枚举

创建简单的枚举类型。

第 1 / 4 课13 个步骤

定义您的第一个枚举 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

What Is an Enum?

枚举(enumeration)允许你通过列出可能的值(称为变体)来定义一个类型。该类型的值只能是这些变体中的其中一个。

当某事物具有一组固定的状态时,枚举非常有用,例如基数方向(东、南、西、北)或扑克牌的花色。

enum Direction {
    North,
    South,
    East,
    West,
}

声明枚举

使用 enum 关键字、一个名称,以及花括号内以逗号分隔的变体列表来声明枚举。

按照惯例,枚举名称使用 PascalCase(例如 Direction),变体名称也使用这种形式(例如 North)。

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

创建枚举值

要构建一个值,请先写枚举名称,接着写两个冒号 ::,最后写变体。

例如,Direction::North 会创建一个 Direction 类型的值。:: 用于告诉 Rust 该变体属于哪个枚举。

enum Direction {
    North,
    South,
    East,
    West,
}

fn main() {
    let heading = Direction::East;
    println!("Created a direction value!");
}

枚举是类型

定义后,枚举就是一种真正的类型,就像 i32 或 bool 一样。您可以将它的值存储在变量中,也可以将它们传递给函数。

接收 Direction 的函数会接受它的任意变体,但不会接受其他内容。

enum Direction {
    North,
    South,
}

fn describe(d: Direction) {
    println!("Got a direction");
}

fn main() {
    describe(Direction::North);
}

为什么不直接使用数字?

您可以用 0、1 和 2 表示交通灯,但这样无法阻止您意外使用 7。

枚举让无效状态变得不可能:编译器保证该值始终是列出的某个变体。这样更安全,也更容易阅读。

派生 Debug 以进行打印

默认情况下,Rust 不知道如何打印枚举。在枚举上方添加 #[derive(Debug)] 后,就可以使用 {:?} 格式化器打印它。

在学习过程中,这对于快速调试非常有用。

#[derive(Debug)]
enum Direction {
    North,
    South,
}

fn main() {
    let d = Direction::South;
    println!("{:?}", d);
}

比较枚举值

添加 #[derive(PartialEq)],即可使用 == 比较变体。

这对于简单检查很方便,不过对于更丰富的行为,match 表达式(即将介绍)通常是更好的工具。

#[derive(PartialEq)]
enum Light {
    Red,
    Green,
}

fn main() {
    let l = Light::Red;
    if l == Light::Red {
        println!("Stop!");
    }
}

允许使用多个变体

枚举可以拥有任意数量的变体。它们都属于同一种类型。

将相关状态列在一起可以让代码更有条理,并让所有可能的选项一目了然。

enum Suit {
    Hearts,
    Diamonds,
    Clubs,
    Spades,
}

标准库中的枚举

Rust 自己的标准库到处都在使用枚举。其中两个著名的枚举是 Option(可能存在也可能不存在的值)和 Result(成功或错误)。

现在学习枚举,有助于您稍后理解这些核心类型。

// Option is an enum in std:
// enum Option<T> {
//     Some(T),
//     None,
// }

复制简单枚举

不携带数据的枚举变体可以派生 Clone 和 Copy。这样,值会自动复制,而不是被移动。

这会让小型状态枚举表现得像整数这样的简单值。

#[derive(Clone, Copy)]
enum Coin {
    Heads,
    Tails,
}

fn main() {
    let a = Coin::Heads;
    let b = a; // a is still usable
}

整合运用

下面是一个完整的程序:定义枚举、创建值,并使用 Debug 打印它。

运行程序,并尝试将 Green 更改为另一个变体,观察输出如何更新。

#[derive(Debug)]
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn main() {
    let current = TrafficLight::Green;
    println!("Light is {:?}", current);
}

快速检查

测试您对枚举基础知识的理解。

回顾

您学会了:enum 关键字可以定义一种类型,该类型由固定列表中的变体组成。

您可以使用 EnumName::Variant 创建值,还可以派生 Debug、PartialEq 或 Copy,以便打印、比较和复制这些值。接下来,您将学习如何使用 match 对每个变体作出响应。

免费开始

用 AI 导师学习 Rust — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「定义您的第一个枚举」课时是免费的吗?

是的 — 「定义您的第一个枚举」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「定义您的第一个枚举」这节课中我会学到什么?

创建简单的枚举类型。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「定义您的第一个枚举」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义您的第一个枚举
  2. 匹配枚举变体
  3. 带数据的枚举
  4. 匹配守卫和绑定
← 返回 Learn Rust Coding