函数与控制流
Rust 中控制流也是表达式——它们能返回值,这让代码更简洁。
1. 函数 fn
fn add(a: i32, b: i32) -> i32 {
a + b // 无分号 = 返回值(表达式)
}
fn main() {
let r = add(2, 3);
println!("{}", r);
}💡表达式 vs 语句
以分号结尾是「语句」(无返回值);不加结尾分号的最后一个表达式就是返回值。也可以显式 return x;,但通常省略更地道。
2. if / else 是表达式
fn main() {
let n = 7;
let desc = if n % 2 == 0 { "偶数" } else { "奇数" };
println!("{} 是 {}", n, desc);
}⚠️两个分支类型要一致
if/else 作为表达式返回值时,所有分支必须返回同一类型,否则编译失败。
3. 循环:loop / while / for
fn main() {
// loop:无限循环,用 break 退出并可带值
let mut i = 0;
let result = loop {
i += 1;
if i == 5 { break i * 10; }
};
println!("loop 结果 = {}", result);
// while:条件循环
let mut n = 3;
while n > 0 {
n -= 1;
}
// for:遍历集合,最常用
for x in 0..3 {
println!("x = {}", x);
}
}4. match 穷尽匹配
match 类似增强版 switch,但必须覆盖所有可能:
fn describe(n: i32) -> &'static str {
match n {
0 => "零",
1 | 2 => "小",
3..=9 => "个位数",
_ => "其他", // 通配,保证穷尽
}
}
fn main() {
println!("{}", describe(0));
println!("{}", describe(2));
println!("{}", describe(5));
println!("{}", describe(100));
}ℹ️为什么 match 安全
编译器强制「穷尽性」:漏掉任何分支(包括通配 _)都会编译报错。这避免了「忘了处理某种情况」的 bug。
5. 循环标签与 continue
嵌套循环可用 'label 跳出指定层:
fn main() {
'outer: for i in 0..3 {
for j in 0..3 {
if i + j == 2 { break 'outer; }
}
}
}🎯练习
写一个函数 fn fib(n: u32) -> u32 用 loop 计算第 n 个斐波那契数(用三个变量滚动即可),再用 for 打印前 10 项。体会 break 带返回值与 for 遍历。
小结
- 函数返回值用「无分号表达式」,或显式
return if/else是表达式,分支类型须一致loop可break带值;for遍历最常用match强制穷尽匹配,通配_兜底- 下一章进入 Rust 最核心:所有权 →