讲解
if 在 Rust 里是表达式:let number = if condition { 5 } else { 6 }。两个要求随之成立:条件必须是 bool(没有 C/JS 那种「真值」隐式转换,if 1 编译不过);各分支的值类型必须一致(因为编译器要确定整个表达式的类型)。分支多了用 else if 链;更多分支或需要按值匹配时,用第 14 章的 match——那才是 Rust 控制流的主力。
循环有三种。loop 是无限循环,配合 break 退出——而且 break 可以带值:let result = loop { break count * 10; },整个循环成为表达式,这是 Rust 独有的便利。while 是条件循环,适合「次数未知、条件明确」。for 是遍历循环,配合区间(1..4 是 1、2、3,1..=4 含 4)或可迭代集合使用,是三种循环里最常用的——能 for 就不 while,能迭代器就不手动下标。
区间(range)值得单独记:a..b 左闭右开,a..=b 双闭,.. 全开。配合 .rev() 反向、配合 .step_by() 跳步。for 循环遍历数组时直接 for x in arr(按值移动,要求元素可复制或你不再需要数组)、for x in &arr(借用,数组还能继续用)、for x in &mut arr(遍历中修改元素)。
示例
if 是表达式;loop 用 break 带出结果:
fn main() {
let n = 7;
let desc = if n % 2 == 0 { "偶数" } else { "奇数" };
assert_eq!(desc, "奇数");
let mut count = 0;
let result = loop {
count += 1;
if count == 3 {
break count * 10; // 循环表达式的值
}
};
assert_eq!(result, 30);
println!("{n} 是{desc},循环结果 {result}");
}
while 倒数;for 遍历区间和数组:
fn main() {
let mut n = 3;
while n > 0 {
println!("{n}...");
n -= 1;
}
println!("发射!");
for i in (1..=3).rev() {
println!("倒数 {i}");
}
let names = ["小林", "小陈", "小周"];
for (idx, name) in names.iter().enumerate() {
println!("第 {} 位:{name}", idx + 1);
}
}
常见坑
- if 条件写非布尔:if number 在 Rust 里编译报错,必须写 if number != 0。刚从中动态语言转过来最常踩。
- 分支类型不一致:if c { 5 } else { "六" } 不行——一个给数字一个给字符串,整个表达式类型无法确定。
- 记错区间开闭:1..4 不含 4,这是遍历下标时想要的;想包含右端用 1..=4。
- 循环里修改正在遍历的集合:for x in v { v.push(...) } 会被借用检查器拦下(遍历持有了不可变借用);先收集再合并,或换 while + 下标。
小结
if 是表达式、条件必须 bool;loop + break 带值、while 按条件、for 按迭代;区间 1..4 左闭右开。下一章开始进入 Rust 的灵魂:所有权。