Rust 学习笔记 04:控制流程
“Controlling complexity is the essence of computer programming.” – Brian Kernighan
写控制流程(条件判断、循环)是程序员每天都在做的事。
对于 Go 开发者来说,我们习惯了 if err != nil 和万能的 for 循环。
但在 Rust 里,控制流程被注入了"表达式"的灵魂,变得更加灵活(也更骚)。
1. if 表达式
注意标题:是 if 表达式,不是 if 语句。这意味着 if 结构本身可以产生一个值。
基础用法
和 Go 一样,Rust 的 if 条件不需要括号 (),但执行体必须用大括号 {}。
1let number = 3;
2if number < 5 {
3 println!("condition was true");
4} else {
5 println!("condition was false");
6}
作为表达式赋值
这是 Go 做不到的。因为 if 是表达式,我们可以把它放在 let 语句的右边。这完全替代了 Java/C++ 中的三元运算符 ? :。
1let condition = true;
2let number = if condition { 5 } else { 6 };
3
4println!("The value of number is: {}", number); // 5
注意:
if 和 else 分支返回的数据类型必须相同。你不能一个分支返回 i32,另一个返回 &str(除非你用枚举封装)。
2. 循环三剑客
Go 只有一个 for 关键字打天下。Rust 虽然也崇尚极简,但在循环上它提供了三个关键字:loop, while, for。
loop:无限循环
loop 对应 Go 的 for {}。它最独特的用法是:它可以返回值。
1let mut counter = 0;
2
3let result = loop {
4 counter += 1;
5 if counter == 10 {
6 break counter * 2; // break 后面带上返回值
7 }
8};
9
10println!("The result is {}", result); // 20
这种写法在写重试逻辑、状态机时非常有用。
while:条件循环
用法和 Go 的 for condition {} 一样。
1let mut number = 3;
2while number != 0 {
3 println!("{}!", number);
4 number -= 1;
5}
for:遍历集合
这是 Rust 中使用频率最高的循环,对应 Go 的 for range。但 Rust 的 for 是基于迭代器 (Iterator) 的。
1let a = [10, 20, 30, 40, 50];
2
3for element in a {
4 println!("the value is: {}", element);
5}
Range (范围)
如果想循环指定次,可以使用 Range。
1// 1..4 表示左闭右开区间 [1, 4) -> 1, 2, 3
2for number in (1..4).rev() { // .rev() 反转迭代
3 println!("{}!", number);
4}
3. 小结
第四篇笔记,我们看完了 Rust 的控制流程。
if是表达式,可以用来赋值(替代三元运算符)。loop是无限循环,可以通过break返回值。for循环是基于迭代器的,通常配合Range使用。
下一篇,我们将迎来 Rust 的终极大 Boss —— 所有权 (Ownership)。
这是劝退率最高的一关,也是 Rust 最核心的灵魂。准备好你的脑细胞,我们要开始烧脑了。
练习题:
- 编写一个函数,使用
loop循环实现斐波那契数列计算,并返回第 n 个数。 - 将摄氏度转换逻辑写成一个
if表达式,赋值给变量。
思考题:
为什么 Rust 提供了 loop 关键字,而不是像 Go 一样只用 for?loop 在语义上有什么特殊含义(提示:搜索 rust control flow graph check)?
本文代码示例:
关注公众号:极客老墨
更多 AI 应用开发、工程实践和效率工具分享,欢迎扫码关注。
