匹配枚举变体
使用 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 反馈 — 无需本地设置。