0Pricing
Learn Rust Coding · 课时

if let 与 while let

简洁的匹配

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

简洁匹配

有时您只关心一种模式。if let 和 while let 可以在不写完整 match 的情况下进行简洁匹配。

if let 形式

只有当值匹配某个模式时,if let 才会运行代码块,并绑定捕获到的任何数据。

fn main() {
    let maybe = Some(10);
    if let Some(n) = maybe {
        println!("value is {n}");
    }
}

if let 与 match

if let 相当于只包含一个重要分支、并以 _ => () 处理其他情况的 match。当其他情况无需处理时,请使用它。

fn main() {
    let config: Option<i32> = None;
    // match equivalent would have an empty _ arm
    if let Some(v) = config {
        println!("configured: {v}");
    }
    println!("done");
}

添加 else

附加 else,即可处理不匹配的情况。

fn main() {
    let result: Result<i32, String> = Err("boom".to_string());
    if let Ok(v) = result {
        println!("ok: {v}");
    } else {
        println!("failed");
    }
}

let else

let ... else 会在模式匹配时进行绑定,否则运行一个发散代码块(例如 return)。它非常适合提前退出。

fn parse(s: &str) -> i32 {
    let Ok(n) = s.parse::<i32>() else {
        println!("not a number");
        return 0;
    };
    n * 2
}

fn main() {
    println!("{}", parse("21"));
    println!("{}", parse("oops"));
}

while let 形式

只要值持续匹配某个模式,while let 就会不断循环。它非常适合耗尽栈等数据结构。

fn main() {
    let mut stack = vec![1, 2, 3];
    while let Some(top) = stack.pop() {
        println!("popped {top}");
    }
}

遍历迭代器

while let 可以通过反复调用 next 进行迭代,并在返回 None 时停止。

fn main() {
    let mut iter = [10, 20, 30].into_iter();
    while let Some(x) = iter.next() {
        println!("{x}");
    }
}

在 if let 中使用守卫

可以添加 && 条件(Rust 2024)来组合守卫,也可以在其中嵌套一个 if。

fn main() {
    let value = Some(8);
    if let Some(n) = value {
        if n > 5 {
            println!("big: {n}");
        }
    }
}

如何选择

参考原则:

  • if let ——处理一种模式,忽略其余情况
  • let else ——绑定,或提前退出
  • while let ——只要模式持续匹配就循环
  • match ——需要处理多种情况时使用

可读性权衡

这些形式可以减少样板代码,但也可能隐藏某些情况。如果您发现自己需要处理多个模式,请改用完整的 match,以提高可读性。

嵌套 if let

通过嵌套 if let,您可以逐层解包可选值。

fn main() {
    let outer: Option<Option<i32>> = Some(Some(99));
    if let Some(inner) = outer {
        if let Some(value) = inner {
            println!("value is {value}");
        }
    }
}

快速检查

哪种结构会在值持续匹配某个模式时,反复运行循环主体?

回顾

您学习了简洁匹配:

  • if let 处理单个模式,也可以选择使用 else
  • let else 会绑定,或提前发散退出
  • while let 会在模式匹配时循环
  • 需要处理多种情况时,改用 match

常见问题解答

「if let 与 while let」课时是免费的吗?

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

「if let 与 while let」这节课中我会学到什么?

简洁的匹配 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「if let 与 while let」课时需要多长时间?

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

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

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

此课程中的所有课时

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