Rust 控制流:if 与三种循环
更新时间:2026-09-20。Rust 的控制结构大多是表达式,可以直接产生值。配合迭代器时,
for是最常用的遍历方式。
一、if 是表达式
rust
let n = 7;
let label = if n % 2 == 0 { "even" } else { "odd" }; // 分支赋值- 条件必须是
bool,if 1、if vec.len()都编译错误(没有 C/JS 的隐式真值转换),要写if x != 0、if !v.is_empty()。 - 各分支类型必须一致;缺
else时返回()。 if let用于只关心一个模式(见 枚举与模式匹配)。
二、三种循环
rust
// loop:无限循环,break 可带值
let mut i = 0;
let result = loop {
i += 1;
if i == 10 { break i * 2; } // break 的值就是整个 loop 表达式的值
};
// while:条件循环
let mut n = 3;
while n != 0 { n -= 1; }
// for:遍历迭代器 / Range
for e in [10, 20, 30] { println!("{e}"); }
for k in 0..3 { /* 0,1,2:左闭右开 */ }
for k in 0..=3 { /* 0,1,2,3:含右端 */ }| 循环 | 适用 | 要点 |
|---|---|---|
loop | 不知道次数、重试到成功 | 唯一能直接 break 值 的循环 |
while | 按布尔条件循环 | 条件同 if,必须为 bool |
for | 遍历集合/区间 | 消费 IntoIterator,最常用 |
三、循环标签:跳出多层
rust
'outer: for x in 0..3 {
for y in 0..3 {
if x + y > 2 { break 'outer; } // 直接跳出外层
}
}默认 break/continue 只作用于最内层;带 'label 的可作用于指定外层循环,免去「标志位层层传」。
四、循环与所有权、借用
rust
let v = vec![String::from("a"), String::from("b")];
for s in v { /* s: String,元素被 move 出来,循环后 v 不可用 */ }
let w = vec![1, 2, 3];
for x in &w { /* x: &i32,只读借用,w 之后仍可用 */ }
let mut m = vec![1, 2];
for x in &mut m { *x += 1; } // 可变借用,通过 *x 改元素遍历时不能同时做会使迭代器失效的结构性修改(边遍历边 push),这与借用规则一致;需要改长度时用索引 while + retain/先收集。
五、常见坑
Range边界:0..n不含n,要含端点用..=;倒序要用(0..n).rev(),3..0是空区间。- 循环里误用不可变遍历去改:
for x in &v { ... }拿到的是&T,要改元素用&mut v并解引用。 - 条件写成整数:Rust 不做布尔强转,显式写比较表达式。
while let消费迭代器:手动while let Some(x) = iter.next()可行,但多数场景for或迭代器适配器更简洁。
总结
Rust 的 if 是表达式、条件必须是真正的 bool 且各分支类型一致;循环有 loop(可 break 带值、适合重试)、while(布尔条件)和 for(消费 IntoIterator 遍历集合与 Range,区间 0..n 左闭右开、0..=n 含端点);用 'label 可让 break/continue 作用到外层循环,遍历时按值会 move 元素、&v 只读、&mut v 才能经解引用改元素,且不可在借用遍历中做结构性增删。