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

注意ifelse 分支返回的数据类型必须相同。你不能一个分支返回 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 最核心的灵魂。准备好你的脑细胞,我们要开始烧脑了。


练习题

  1. 编写一个函数,使用 loop 循环实现斐波那契数列计算,并返回第 n 个数。
  2. 将摄氏度转换逻辑写成一个 if 表达式,赋值给变量。

思考题

为什么 Rust 提供了 loop 关键字,而不是像 Go 一样只用 forloop 在语义上有什么特殊含义(提示:搜索 rust control flow graph check)?


本文代码示例

关注公众号:极客老墨

更多 AI 应用开发、工程实践和效率工具分享,欢迎扫码关注。

极客老墨微信公众号二维码

相关阅读