Learn Rust Coding · 课时

深入理解 match

模式与守卫

第 1 / 4 课13 个步骤

深入理解 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入理解 match
  2. if let 与 while let
  3. 使用 @ 进行绑定
  4. 解构
← 返回 Learn Rust Coding