0Pricing
Learn Rust Coding · 课时

匹配枚举变体

使用 match 处理每种情况。

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

认识 match 表达式

match 表达式会将一个值与一系列模式进行比较,并运行第一个匹配模式对应的代码。

它是枚举的天然搭档:您可以在各自的分支中处理每个变体。

enum Light {
    Red,
    Green,
}

fn action(l: Light) {
    match l {
        Light::Red => println!("Stop"),
        Light::Green => println!("Go"),
    }
}

match 分支的结构

每个分支的形式都是 pattern => expression,各分支之间用逗号分隔。

模式指定要匹配的内容,=> 后面的表达式会在匹配成功时运行。这里的模式是单个枚举变体。

match light {
    Light::Red => println!("Stop"),
    Light::Green => println!("Go"),
}

完整的匹配程序

下面是一个完整的程序,它会匹配交通灯并打印一条指令。

运行程序,然后更改 main 中的变体,观察另一个分支执行。

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn main() {
    let light = TrafficLight::Yellow;
    match light {
        TrafficLight::Red => println!("Stop"),
        TrafficLight::Yellow => println!("Slow down"),
        TrafficLight::Green => println!("Go"),
    }
}

match 必须穷尽所有情况

Rust 要求 match 覆盖每一个可能的变体。如果遗漏某个变体,程序将无法编译。

这是一项强大的安全功能:以后添加新变体时,编译器会提醒您所有必须处理它的位置。

// This would FAIL to compile because
// the Green case is missing:
// match light {
//     Light::Red => println!("Stop"),
// }

使用 _ 匹配所有情况

如果您不想列出每个变体,可以使用下划线 _ 作为匹配所有情况的模式。它会匹配上面未处理的任何内容。

请将它放在最后,因为分支会按顺序尝试。

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Dime;
    match c {
        Coin::Penny => println!("1 cent"),
        _ => println!("Some other coin"),
    }
}

match 返回一个值

match 是一个表达式,因此会产生一个可以存储在变量中的值。

每个分支都必须返回相同的类型。请注意,这里的每个分支表达式后面都没有分号。

enum Coin {
    Penny,
    Quarter,
}

fn main() {
    let coin = Coin::Quarter;
    let cents = match coin {
        Coin::Penny => 1,
        Coin::Quarter => 25,
    };
    println!("{} cents", cents);
}

多行分支体

分支可以将多条语句放在花括号 { ... } 中执行。

花括号内的最后一个表达式就是该分支产生的值。

match light {
    Light::Red => {
        println!("Caution!");
        println!("Stop the car");
    }
    Light::Green => println!("Go"),
}

使用 | 组合模式

使用管道符 | 在一个分支中匹配多个变体。它表示“或”。

对于应该以相同方式处理的变体,这样可以避免重复编写相同的主体。

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Nickel;
    match c {
        Coin::Penny | Coin::Nickel => println!("Small coin"),
        _ => println!("Bigger coin"),
    }
}

match 与 if/else 的区别

您可以链接 if / else if 来检查变体,但 match 更清晰、更安全。

使用 match 时,编译器会验证您是否处理了每种情况。而一连串的 if 语句没有这样的保证。

同时进行匹配和打印

一种常见模式是将变体转换为易读的字符串并打印出来。

运行此程序,然后更改所选方向,观察匹配到的消息。

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

fn main() {
    let d = Direction::West;
    let name = match d {
        Direction::North => "North",
        Direction::South => "South",
        Direction::East => "East",
        Direction::West => "West",
    };
    println!("Heading {}", name);
}

顺序很重要

分支会从上到下进行检查,第一个匹配项获胜,其余分支会被跳过。

这就是为什么匹配所有情况的 _ 必须放在最后:如果它位于第一位,就会在具体分支运行前吞掉所有值。

快速检查

检查您对 match 的理解。

回顾

您学会了:match 会将一个值与模式进行比较,并运行第一个匹配的分支。

它必须覆盖所有情况,可以使用 _ 匹配所有情况,可以使用 | 组合变体,并且由于它是表达式,所以会返回一个值。接下来,您将为枚举变体添加各自的数据。

常见问题解答

「匹配枚举变体」课时是免费的吗?

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

「匹配枚举变体」这节课中我会学到什么?

使用 match 处理每种情况。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「匹配枚举变体」课时需要多长时间?

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

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

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

此课程中的所有课时

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