Skip to content

Rust 控制流完整学习总结

本文基于实际代码学习过程,总结 Rust 中常见控制流结构: if / loop / while / for / continue / break / match 并给出一套清晰的选择心智模型


一、if:在 Rust 中是「表达式」

Rust 的 if 可以返回值,这与很多语言不同。

rust
let a: i32 = 3;

let b = if a > 5 {
    1
} else if a >= 3 {
    3
} else {
    6
};

println!("b {}", b);

关键规则

  • if 的每个分支 必须返回同一类型
  • 结尾没有 ;
  • if 可以嵌套,但不适合复杂分支

二、loop:最底层、最强的循环结构

rust
loop {
    println!("loop");
    break;
}

特点

  • 默认无限循环
  • 一切退出都靠 break
  • 是 Rust 中最“原始”的循环

三、带标签的 loop:精确控制跳出层级

rust
'outer: loop {
    println!("进入外层 loop");

    loop {
        println!("进入内层 loop");
        break 'outer;
    }
}

println!("退出外层循环");

心智模型

  • label 是 跳转目标
  • break 'label = 直接跳到指定层级之外
  • 非常适合嵌套状态控制

四、loop 可以返回值

rust
let mut counter = 0;

let result = loop {
    counter += 1;

    if counter == 10 {
        break counter * 2;
    }
};

println!("result {}", result);

👉 loop 在 Rust 中,本质上是一个表达式


五、continue:跳过本轮,进入下一轮

rust
loop {
    if some_condition {
        continue;
    }

    // 只有条件不满足时才会执行到这里
}

核心语义

  • 结束当前这一轮
  • 不会退出循环
  • break 完全不同

六、while:条件驱动的循环

rust
let mut n = 1;

while n < 101 {
    println!("{}", n);
    n += 1;
}

本质理解

  • 每一轮开始前判断条件
  • 条件为 false 时自动退出
  • 通常需要手动维护变量

while + continue 示例(FizzBuzz)

rust
let mut n = 1;

while n < 101 {
    if n % 15 == 0 {
        println!("fizzbuzz");
        n += 1;
        continue;
    }

    if n % 3 == 0 {
        println!("fizz");
        n += 1;
        continue;
    }

    if n % 5 == 0 {
        println!("buzz");
        n += 1;
        continue;
    }

    println!("{}", n);
    n += 1;
}

while 的适用边界

✅ 适合:

  • 条件清晰
  • 退出规则单一

❌ 不适合:

  • 多状态切换
  • 多个 break / continue

👉 这种情况下,应转向 loop + match


七、for:遍历驱动的循环

rust
let arr = [1, 2, 3, 4, 5, 6];

for i in arr {
    println!("arr {}", i);
}
rust
for number in (1..4).rev() {
    println!("{number}!");
}
println!("LIFTOFF!!!");

特点

  • 自动处理边界
  • 不需要索引
  • 最安全、最推荐

八、match:Rust 的核心控制结构

基础用法

rust
let x = 3;

match x {
    1 => println!("one"),
    2 | 3 => println!("two or three"),
    _ => println!("other"),
}

模式匹配能力

1️⃣ _:兜底分支

rust
_ => {}

2️⃣ 范围匹配

rust
match x {
    1..=5 => println!("small"),
    _ => println!("large"),
}

3️⃣ 解构匹配

rust
let tuple = (1, 2);

match tuple {
    (1, y) => println!("y = {}", y),
    _ => {}
}

九、用 loop + match 重写复杂逻辑

rust
let mut n = 1;

loop {
    match n {
        1..=100 if n % 15 == 0 => println!("fizzbuzz"),
        1..=100 if n % 3 == 0 => println!("fizz"),
        1..=100 if n % 5 == 0 => println!("buzz"),
        1..=100 => println!("{}", n),
        _ => break,
    }

    n += 1;
}

👉 状态集中、逻辑清晰、无重复 continue


十、什么时候用 if,什么时候用 match?

✅ 用 if

  • 判断条件少
  • 逻辑是「是 / 否」
  • 临时、局部判断

✅ 用 match

  • 多分支
  • 有枚举 / 状态
  • 需要穷尽所有情况

经验法则: 当 else if 超过 2 个,就该考虑 match


总结一句话

if 适合判断,while 适合条件循环, for 适合遍历, loop + match 才是 Rust 的最终形态。

这套控制流,是 Rust 写出安全、可维护、状态清晰代码的根基。