Learn Rust Coding · 课时

匹配守卫和绑定

添加条件并捕获值。

第 4 / 4 课13 个步骤

匹配守卫和绑定 是 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 反馈 — 无需本地设置。

此课程中的所有课时

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