🎯前言
根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是
if
表达式和循环。
🎯if表达式
fn main() { let number = 3; if number < 5 { println!("condition was true"); } else { println!("condition was false"); } }
所有的 if 表达式都以 if 关键字开头,其后跟一个条件。在这个例子中,条件检查变量 number 的值是否小于 5。在条件为 true 时希望执行的代码块位于紧跟条件之后的大括号中。
if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。”
注意:条件 必须 是 bool 值。如果条件不是 bool 值,我们将得到一个错误。
🎯使用else if 处理多重条件
fn main() { let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } else if number % 3 == 0 { println!("number is divisible by 3"); } else if number % 2 == 0 { println!("number is divisible by 2"); } else { println!("number is not divisible by 4, 3, or 2"); } }
当执行这个程序时,它按顺序检查每个 if 表达式并执行第一个条件为 true 的代码块。注意即使 6 可以被 2 整除,也不会输出 number is divisible by 2,更不会输出 else 块中的 number is not divisible by 4, 3, or 2。原因是 Rust 只会执行第一个条件为 true 的代码块,并且一旦它找到一个以后,甚至都不会检查剩下的条件了。
🎯let语句中使用if
因为
if
是一个表达式,我们可以在let
语句的右侧使用它,如:
fn main() { let condition = true; let number = if condition { 5 } else { 6 }; println!("The value of number is: {number}"); }
注意:代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。
并且,Rust是强类型,变量比较必须类型一致。
🎯循环
🚝使用loop
暴力方法:直到我们手动停止程序。大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序。
但是,Rust 提供了一种从代码中跳出循环的方法。可以使用
break
关键字来告诉程序何时停止循环,我们在猜谜游戏中也使用了continue
。循环中的continue
关键字告诉程序跳过这个循环迭代中的任何剩余代码,并转到下一个迭代。
🚝循环返回值
loop
的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。如果将返回值加入你用来停止循环的break
表达式,它会被停止的循环返回:
fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!("The result is {result}"); }
多重循环可以使用标签:
如果存在嵌套循环,break 和 continue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签(loop label),然后将标签与 break 或 continue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例
fn main() { let mut count = 0; 'counting_up: loop { println!("count = {count}"); let mut remaining = 10; loop { println!("remaining = {remaining}"); if remaining == 9 { break; } if count == 2 { break 'counting_up; } remaining -= 1; } count += 1; } println!("End count = {count}"); }
外层循环有一个标签
counting_up
,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的break
将只退出内层循环。break 'counting_up;
语句将退出外层循环。
🚝while循环
在程序中计算循环的条件也很常见。当条件为
true
,执行循环。当条件不再为true
,调用break
停止循环。这个循环类型可以通过组合loop
、if
、else
和break
来实现;
fn main() { let mut number = 3; while number != 0 { println!("{number}!"); number -= 1; } println!("LIFTOFF!!!"); }
这种结构消除了很多使用
loop
、if
、else
和break
时所必须的嵌套,这样更加清晰。当条件为true
就执行,否则退出循环。
🚝for循环
for
循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。倒计时例子,大部分 Rustacean 也会使用
for
循环。这么做的方式是使用Range
,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。下面是一个使用
for
循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev
,用来反转 range: 注意: 以下代码不会踏足到数字 9 ,仅从一个数字开始到另一个数字之前fn main() { for number in (1..4).rev() { println!("{number}!"); } println!("LIFTOFF!!!"); }