0Pricing
Learn Rust Coding · 课时

强大的模式匹配

掌握 `match` 表达式和其他模式匹配结构,以简洁而完整地处理数据变体。

强大的模式匹配 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 3 节课。

释放模式匹配的力量

欢迎来到 Rust 的模式匹配世界!这一强大功能可以让您根据数据的结构控制程序流程。

您不仅可以检查是否相等,还可以解构值、提取组成部分,并针对不同的数据形状执行特定代码。

  • 它就像功能更强大的 if/else 或 switch 语句。
  • 确保穷尽性:您必须处理所有可能的模式。
  • 让代码更易读、更健壮。

`match` 表达式基础

模式匹配的核心是 match 表达式。它接受一个值,并将其与一系列模式进行比较。第一个匹配的模式将获胜!

match 表达式的每个“分支”都由一个模式和该模式匹配时要执行的代码组成。

enum Direction {
  North,
  East,
  South,
  West,
}

fn main() {
  let my_direction = Direction::North;

  match my_direction {
    Direction::North => println!("Going up!"),
    Direction::East => println!("Going right!"),
    Direction::South => println!("Going down!"),
    Direction::West => println!("Going left!"),
  }
}

匹配字面量和范围

您可以匹配特定的字面量值(数字、字符、布尔值),也可以使用 ..= 定义范围。| 运算符允许一个分支匹配多个模式。

请记住,模式会按顺序检查,并使用第一个匹配项。

fn main() {
  let x = 7;

  match x {
    1 => println!("It's one!"),
    2 | 3 => println!("It's two or three!"),
    4..=8 => println!("It's between four and eight!"),
    _ => println!("It's something else!"), // Catch-all
  }

  let character = 'b';
  match character {
    'a'..='e' => println!("Early letter"),
    _ => println!("Other letter"),
  }
}

解构结构体

处理结构体等复杂数据类型时,模式匹配尤其有用。您可以直接在 match 分支中将各个字段提取到变量中。

这样可以简洁清晰地访问结构体数据,尤其适合匹配特定字段值的情况。

struct Point {
  x: i32,
  y: i32,
}

fn main() {
  let p = Point { x: 0, y: 7 };

  match p {
    Point { x, y: 0 } => println!("On the X axis at {}", x),
    Point { x: 0, y } => println!("On the Y axis at {}", y),
    Point { x, y } => println!("Not on an axis: ({}, {})", x, y),
  }
}

解构带数据的枚举

Rust 中的枚举可以保存关联数据。模式匹配是从枚举变体中提取这些数据的主要方式。

您可以直接将数据解构到新变量中,从而轻松处理每个变体的内容。

enum Message {
  Quit,
  Move { x: i32, y: i32 },
  Write(String),
  ChangeColor(i32, i32, i32),
}

fn process_message(msg: Message) {
  match msg {
    Message::Quit => println!("Quit message."),
    Message::Move { x, y } => {
      println!("Move to x: {}, y: {}", x, y);
    }
    Message::Write(text) => println!("Text message: {}", text),
    Message::ChangeColor(r, g, b) => {
      println!("Color: R:{}, G:{}, B:{}", r, g, b);
    }
  }
}

fn main() {
  process_message(Message::Move { x: 10, y: 20 });
  process_message(Message::Write(String::from("Hello!")));
}

通配模式 `_`

特殊的 _(下划线)模式充当兜底模式。它可以匹配任何值,但不会绑定该值。

当您需要覆盖所有可能性以满足穷尽性要求,却不关心某个分支所匹配的具体值时,这种模式非常有用。

fn main() {
  let some_value = Some(5);
  let absent_value: Option<i32> = None;

  match some_value {
    Some(x) => println!("Got a value: {}", x),
    _ => println!("Something else!"), // Matches None too
  }

  match absent_value {
    Some(x) => println!("Got a value: {}", x),
    _ => println!("No value here!"),
  }
}

用于单个模式的 `if let`

有时,您只关心匹配某一个特定模式,而想忽略其他所有模式。在这种情况下,if let 是完整 match 表达式的一种更简洁的替代方案。

它的含义基本是:“如果此模式匹配,就执行此操作;否则什么也不做(或执行可选的 else 块)。”

fn main() {
  let config_max = Some(3u8);
  let none_value: Option<u8> = None;

  if let Some(max) = config_max {
    println!("Max configured to be: {}", max);
  }

  if let Some(val) = none_value {
    println!("This won't print: {}", val);
  } else {
    println!("No value found!");
  }
}

用于条件循环的 `while let`

与 if let 类似,while let 允许您在某个模式持续匹配时不断循环。

从 Vec 等集合中处理项目时,这非常有用:您可以持续处理,直到没有更多匹配的元素为止(例如直到 pop() 返回 None)。

fn main() {
  let mut stack = vec![1, 2, 3];

  while let Some(top) = stack.pop() {
    println!("Popped: {}", top);
  }

  println!("Stack is empty now.");
}

匹配守卫:添加条件

您可以在 match 分支中添加一个额外的 if 条件,称为匹配守卫。只有模式匹配且守卫条件为真时,该分支才会执行。

这样无需创建更多枚举变体,就可以在模式内部进行更细致的控制。

fn main() {
  let num = Some(4);

  match num {
    Some(x) if x % 2 == 0 => println!("Even number: {}", x),
    Some(x) if x < 5 => println!("Small odd number: {}", x),
    Some(x) => println!("Any other number: {}", x),
    None => println!("No number"),
  }
}

模式匹配挑战

请考虑下面的 Rust 代码片段。以下关于 match 表达式及其输出的说法哪些是正确的?

enum Status {
  Loading,
  Success(u32),
  Error(String),
}

fn process_status(s: Status) {
  match s {
    Status::Success(code) if code > 200 => println!("Success with high code: {}", code),
    Status::Success(code) => println!("Success with code: {}", code),
    Status::Error(msg) => println!("Failed: {}", msg),
    _ => println!("Status unknown or loading..."),
  }
}

fn main() {
  process_status(Status::Success(201));
  process_status(Status::Error(String::from("Network issue")));
  process_status(Status::Loading);
  process_status(Status::Success(200));
}

回顾:掌握模式

您已经探索了 Rust 模式匹配的强大功能!这是编写清晰、简洁且安全代码的基础概念。

  • match 表达式可以根据数据结构全面控制程序流程。
  • 您可以匹配字面量、范围并使用通配模式(_)。
  • 解构允许直接从结构体和枚举中提取值。
  • if let 和 while let 提供了匹配单个模式的简洁方式。
  • 匹配守卫可以为 match 分支添加条件逻辑。

请继续练习这些模式;它们对于编写符合 Rust 习惯的代码非常重要!

常见问题解答

「强大的模式匹配」课时是免费的吗?

是的 — 「强大的模式匹配」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 3 节课。

「强大的模式匹配」这节课中我会学到什么?

掌握 `match` 表达式和其他模式匹配结构,以简洁而完整地处理数据变体。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。

「强大的模式匹配」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义和使用结构体
  2. 用于自定义类型的枚举
  3. 强大的模式匹配
← 返回 Learn Rust Coding