匹配守卫和绑定
添加条件并捕获值。
匹配守卫和绑定 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
什么是匹配守卫
匹配守卫是添加到匹配分支中的额外 if 条件。只有当模式匹配并且条件为真时,该分支才会执行。
它可以根据变体中的数据,将一个变体细分为更具体的情况。
match number {
Some(n) if n > 0 => println!("positive"),
Some(n) => println!("zero or negative"),
None => println!("no number"),
}守卫语法
先写模式,然后写 if condition,最后写 =>。条件可以使用模式绑定的任何变量。
如果守卫条件为假,Rust 会继续尝试下一个分支。
fn main() {
let n = 4;
match n {
x if x % 2 == 0 => println!("even"),
_ => println!("odd"),
}
}对枚举数据使用守卫
守卫在处理包含数据的枚举时最有用。您可以先绑定内部值,然后对它进行测试。
在这里,正余额和负余额会得到不同的消息,尽管它们属于同一个变体。
enum Account {
Balance(i32),
Closed,
}
fn main() {
let a = Account::Balance(-5);
match a {
Account::Balance(b) if b < 0 => println!("overdrawn"),
Account::Balance(b) => println!("balance {}", b),
Account::Closed => println!("closed"),
}
}顺序仍然很重要
由于分支会从上到下依次尝试,因此请将更具体的带守卫分支放在通用分支之前。
如果普通的 Balance(b) 分支排在前面,它就会匹配所有情况,带守卫的分支将永远不会执行。
匹配字面值
您也可以直接在模式中匹配特定的字面值,而不使用守卫。
这里会精确匹配 0 和 1,而 _ 用来处理其余情况。
fn main() {
let n = 1;
match n {
0 => println!("zero"),
1 => println!("one"),
_ => println!("many"),
}
}匹配范围
模式可以使用 ..= 匹配值的范围,并且范围两端都包含在内。
与使用多个比较守卫相比,这种方式更加简洁。
fn main() {
let score = 85;
match score {
0..=59 => println!("fail"),
60..=100 => println!("pass"),
_ => println!("out of range"),
}
}使用 @ 运算符进行绑定
@ 运算符可以让您同时根据模式测试一个值,并将它绑定到一个名称。
这里的 id @ 1..=5 会检查范围,并将实际值保存到 id 中,以便您打印它。
fn main() {
let n = 3;
match n {
id @ 1..=5 => println!("small id {}", id),
other => println!("other {}", other),
}
}绑定整个值
模式中的普通名称(例如上面的 other)会绑定整个值。它相当于一个仍然可以使用的兜底匹配。
如果您想忽略这个值,请使用 _;如果需要使用它,请使用名称进行绑定。
fn main() {
let n = 99;
match n {
0 => println!("zero"),
value => println!("got {}", value),
}
}结合使用守卫和绑定
您可以将绑定与守卫结合起来进行精确控制:先绑定数据,再添加条件。
这个程序会特别标记较大的偶数余额。
enum Account {
Balance(i32),
}
fn main() {
let a = Account::Balance(200);
match a {
Account::Balance(b) if b > 100 && b % 2 == 0 => println!("big even {}", b),
Account::Balance(b) => println!("normal {}", b),
}
}对多个模式使用守卫
即使一个分支使用 | 组合了多个模式,守卫仍然适用于整个分支。
列出的任一模式匹配后,才会检查这个条件。
fn main() {
let n = 6;
match n {
2 | 4 | 6 if n > 3 => println!("big even"),
_ => println!("other"),
}
}综合运用
这个最终程序结合了带数据的变体、绑定、守卫和兜底匹配,用来对温度读数进行分类。
更改这个值并重新运行,查看不同的分支如何执行。
enum Reading {
Temp(i32),
Missing,
}
fn main() {
let r = Reading::Temp(38);
match r {
Reading::Temp(t) if t >= 38 => println!("fever: {}", t),
Reading::Temp(t) => println!("normal: {}", t),
Reading::Missing => println!("no reading"),
}
}快速检查
检查您对守卫和绑定的理解。
回顾
您已经学会使用守卫(pattern if condition)细化匹配,匹配字面值和范围(..=),并使用名称或 @ 运算符创建绑定。
结合之前学到的内容,您现在可以对固定的状态集合进行建模,为它们附加数据,并精确地响应每种情况。枚举和匹配学得很棒!
用 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 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「匹配守卫和绑定」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。