深入理解 match
模式与守卫
深入理解 match 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
match 表达式
match 会将一个值与一系列模式进行比较,并执行第一个匹配项对应的分支。它是一个表达式,因此会返回一个值。
fn main() {
let n = 3;
let label = match n {
1 => "one",
2 => "two",
3 => "three",
_ => "many",
};
println!("{label}");
}穷尽性
match 必须覆盖所有可能的值。通配符 _ 会捕获前面的分支未匹配的任何值,从而确保匹配完整。
fn main() {
let x = 42;
match x {
0 => println!("zero"),
_ => println!("nonzero"),
}
}匹配多个值
使用 |,即可在一个分支中匹配多个模式。
fn main() {
let c = 'e';
match c {
'a' | 'e' | 'i' | 'o' | 'u' => println!("vowel"),
_ => println!("consonant"),
}
}范围模式
使用 ..=(包含边界)匹配一段值范围。这非常适合对数字或字符进行分组。
fn main() {
let score = 85;
let grade = match score {
90..=100 => 'A',
80..=89 => 'B',
70..=79 => 'C',
_ => 'F',
};
println!("Grade: {grade}");
}匹配守卫
守卫是分支上的额外 if 条件。只有模式匹配且守卫条件为真时,该分支才会匹配。
fn main() {
let pair = (2, -2);
match pair {
(x, y) if x + y == 0 => println!("sum is zero"),
(x, _) if x % 2 == 0 => println!("first is even"),
_ => println!("no rule"),
}
}在模式中绑定
模式可以将匹配到的部分绑定到变量,以便在分支主体中使用。
fn main() {
let msg = Some(7);
match msg {
Some(n) => println!("got {n}"),
None => println!("nothing"),
}
}匹配枚举
match 非常适合处理枚举,尤其是变体携带数据时。
enum Shape {
Circle(f64),
Rectangle(f64, f64),
}
fn area(s: Shape) -> f64 {
match s {
Shape::Circle(r) => 3.14159 * r * r,
Shape::Rectangle(w, h) => w * h,
}
}
fn main() {
println!("{}", area(Shape::Rectangle(3.0, 4.0)));
}使用 _ 和 .. 忽略内容
使用 _ 忽略单个值,使用 .. 忽略元组或结构体的其余部分。
fn main() {
let triple = (1, 2, 3);
match triple {
(first, ..) => println!("first is {first}"),
}
}从 match 返回
由于 match 是一个表达式,您可以赋值使用它的结果,也可以直接返回该结果。每个分支都必须产生相同的类型。
fn describe(n: i32) -> &'static str {
match n.cmp(&0) {
std::cmp::Ordering::Less => "negative",
std::cmp::Ordering::Equal => "zero",
std::cmp::Ordering::Greater => "positive",
}
}
fn main() {
println!("{}", describe(-5));
}分支顺序很重要
分支会从上到下进行检查;第一个匹配的分支会生效。请将具体模式放在通用模式之前,并将通配符放在最后。
使用 @ 绑定范围
将范围与 @ 运算符结合,可以测试一个值,同时在同一个分支中保留它的精确内容。
fn main() {
let n = 42;
match n {
small @ 0..=9 => println!("single digit: {small}"),
big @ 10..=99 => println!("two digits: {big}"),
_ => println!("large"),
}
}快速检查
像 (x, y) if x > y 这样的匹配守卫有什么作用?
回顾
您深入学习了 match:
- 它是一个穷尽式表达式,会返回一个值
|可以匹配多个模式;..=可以匹配范围- 守卫可以添加额外的
if条件 - 模式可以绑定数据;
_和..可以忽略部分内容 - 分支顺序很重要——第一个匹配项会生效
用 AI 导师学习 Rust — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 144
常见问题解答
「深入理解 match」课时是免费的吗?
是的 — 「深入理解 match」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「深入理解 match」这节课中我会学到什么?
模式与守卫 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「深入理解 match」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 深入理解 match
- if let 与 while let
- 使用 @ 进行绑定
- 解构