九、Rust 条件判断

编程语言是模拟现实生活的,如果你有哪块搞不清楚,那么只要从现实生活中找例子即可。

我们的生活,大部分都是流水线似的,比如

  1. 睡醒 -> 早餐 -> 上班/上学 -> 午餐 -> 上班/上学 -> 回家 -> 晚饭 -> 睡觉

虽然站在每天的角度考虑,生活真的是顺风顺水,流水作业,但是,精确到每件事,就会有很多小插曲

比如

  1. 睡醒 -> (如果天还没亮则继续睡,否则起床吃早餐)

比如

  1. 如果是周六或周日,就不用上班或上课

也就是说,具体到每件事,都是根据一个条件作出判断,如果条件为真则怎么样,如果条件为假又怎么样,等等。

因为编程语言也是模拟生活的,所以,编程语言一般情况下,从入口代码开始,一条一条往下执行,比如

  1. fn main()
  2. {
  3. let name = "小明"; // 名字
  4. let firstMeet = false; // 是否第一次见
  5. println!("{},你好!",name);
  6. println!("很高兴见到你");
  7. println!("我是零基础教程");
  8. println!("你叫什么名字");
  9. }

上面这段代码,会从上往下一行一行的执行。所以输出的结果就是

  1. 你好!
  2. 很高兴见到你
  3. 我是零基础教程
  4. 你叫什么名字

但有时候,我们会想: 如果是第一次见则输出问候语,如果不是第一次见,则直接输出名字即可

对于这种现实生活中常见的需求,我们在程序中有要怎么模拟呢 ?

9.1 编程语言中的条件判断

我们说过编程语言也是模拟现实生活,针对上面提到的 如果…就… 或者 如果…就…否则就… 选择判断,我们称之为 条件判断

也就是说,条件判断就是

  1. 如果 .... ...

或者

  1. 如果 .... ... 否则 ....

或者

  1. 如果 .... .... 否则如果 ... ... 否则如果 ... .... 否则 ....

绝大多数的编程语言都有着相同的条件判断语句,它们都是针对一个条件的真或假作出不同的选择,基本的流程图如下

9. Rust 条件判断 - 图1

条件判断语句 说明
if 语句 if 语句用于模拟现实生活中的 如果…就…
if…else 语句 if…else 语句用于模拟 如果…就…否则…
else…if 和嵌套if 语句 嵌套if 语句用于模拟 如果…就…如果…就…
match 语句 match 语句用于模拟现实生活中的 老师点名 或 银行叫号

9.2 if 语句

我们经常会说 如果肚子饿了就吃饭,如果今天天晴,我们就去郊游,如果….。

我们把这种 如果…就 语句叫做 条件语句,其中 肚子饿了、天晴 等叫做 条件,而 吃饭、郊游 叫做条件为真时要执行的 动作。

Rust 语言中使用 if 语句来模拟现实生活中这种 如果…就 的情况。

9.2.1 if 语句语法

  1. if boolean_expression {
  2. // boolean_expression 为 true 时要执行的语句
  3. // statement(s)
  4. }

因此,if 语句简单来说,就是

  1. 如果 boolean_expression 为 true ,则执行大括号里的 statement(s)。
  2. 如果 boolean_expression 为 false ,则执行大括号后面的第一条语句。

如果肚子饿了就吃饭 格式化为 if 语句就是

  1. if 肚子饿了 {
  2. 吃饭
  3. }

9.2.2 范例

我们写一个范例,使用 if 语句来模拟 如果数字大于 0 则输出 正数。

  1. fn main(){
  2. let num:i32 = 5;
  3. if num > 0 {
  4. println!("正数");
  5. }
  6. }

编译运行以上 Rust 代码,输出结果如下

  1. 正数

9.3 if else 语句

生活既有着流水线式的日复一日,也有着只有一个选择题的如果。 然而只有一个选择题的如果真的只有一个选择吗?

不是的,不是还有另一个选择,就是什么都不做吗?

如果另一个选择是做些什么,那么,不就变成了

  1. 如果 ... ... 否则就...

编程语言的创建者早就想到了这种二选一的情况,特意为 if 语句后面跟着一个可选的 else 语句。

这种二选一的 if 语句,我们称之为 if else 语句。

9.3.3 if..else 语句语法格式

  1. if boolean_expression {
  2. // 如果 boolean_expression 为真则执行这里的代码
  3. } else {
  4. // 如果 boolean_expression 为假则执行这里的代码
  5. }

9.3.4 if..else 语句流程图

9. Rust 条件判断 - 图2

  1. 在 if else 语句中,if 语句才是最主要的。如果 条件 为真,就没 else 语句啥事了。

  2. 其实 if 语句后面的 else 语句是可选的。就像我们所说的,如果条件为假就什么都不做,那要 else 语句有什么用呢?else 语句的唯一作用,就是 if 语句中的 条件 为假时做些什么,执行些什么

9.3.5 范例

我们写一段代码,使用 if else 语句来判断一个数是否偶数或奇数,如果是偶数则输出 偶数 如果是奇数则输出 奇数

  1. fn main() {
  2. let num = 12;
  3. if num % 2==0 {
  4. println!("偶数");
  5. } else {
  6. println!("奇数");
  7. }
  8. }

编译运行以上 Rust 代码,输出结果如下

  1. 偶数

9.4 嵌套 If 语句

现实生活中肯定不会只有 如果…不然就 这种二选一的情况,还存在多个 如果 的情况。

比如 如果今天天晴,我们就去郊游,如果下雪,我们就堆雪人,如果下雨,我们就逛商场,如果下暴雨,我们就在家看电视。

面对多个 如果 这种情况,我们可以使用 嵌套 if 语句。

嵌套 if 语句用于测试多种条件。

9.4.1 语法

嵌套 If 语句的语法格式如下

  1. if boolean_expression1 {
  2. // 当 boolean_expression1 为 true 时要执行的语句
  3. } else if boolean_expression2 {
  4. // 当 boolean_expression2 为 true 时要执行的语句
  5. } else {
  6. // 如果 boolean_expression1 和 boolean_expression2 都为 false 时要执行的语句
  7. }

是不是看起来有点复杂了。

使用嵌套 if 语句,也就是 if…else if… 语句时需要牢记几个点:

  • 任何一个 if 或者嵌套 if 语句可以有 0 个或 1 个 else 语句,但 else 语句必须出现在 if else 后面,也就是出现在最后。

  • 任何一个 if 或者嵌套 if 语句可以有 0 个或多个 if else 语句,但所有的 if else 语句都必须出现在 else 语句之前。

  • 一旦某个 else if 中的条件 boolean_expression1 返回 true,那么后面的 else if 和 else 语句都不会运行。

9.4.2 范例

我们使用嵌套 if 语句来写一段代码,判断某个值是 大于、小于、等于 0。

  1. fn main() {
  2. let num = 2 ;
  3. if num > 0 {
  4. println!("{} is positive",num);
  5. } else if num < 0 {
  6. println!("{} is negative",num);
  7. } else {
  8. println!("{} is neither positive nor negative",num) ;
  9. }
  10. }

编译运行以上 Rust 代码,输出结果如下

  1. 2 is positive

9.5 match 语句

match 语句用于检查某个当前的值是否匹配一组/列值 中的某一个。

如果放到现实生活中,那么 match 语句类似于 老师点名 或者 银行叫号。当老师叫一个名字,比如 小明 时,叫 小明 的那个人就会应答,比如说 到。

如果你会 C 语言,那么 Rust 中的 match 表达式则类似于 C 语言中的 switch 语句。

对 match 语句有了个大概的印象之后,我们来看看 Rust 中的 switch 语句的语法格式

9.5.1 match 语句语法格式

Rust 中一个基本的 match 语句语法格式如下

  1. match variable_expression {
  2. constant_expr1 => {
  3. // 语句;
  4. },
  5. constant_expr2 => {
  6. // 语句;
  7. },
  8. _ => {
  9. // 默认
  10. // 其它语句
  11. }
  12. };

match 语句有返回值,它把 匹配值 后执行的最后一条语句的结果当作返回值。

  1. let expressionResult = match variable_expression {
  2. constant_expr1 => {
  3. // 语句;
  4. },
  5. constant_expr2 => {
  6. // 语句;
  7. },
  8. _ => {
  9. // 默认
  10. // 其它语句
  11. }
  12. };

我们来分析下上面这两个 match 语句的语法:

  1. 首先要说明的是 match 关键字后面的表达式不必括在括号中。也就是 variable_expression 不需要用一对 括号(()) 括起来。

  2. 其次,match 语句在执行的时候,会计算 variable_expression 表达式的值,然后把计算后的结果和每一个 constant_exprN 匹配,使用的是 全等于 也就是 === 来匹配。如果匹配成功则执行 => {} 里面的语句。

  3. 如果 variableexpression 表达式的值没有和任何一个 constant_exprN 匹配,那么它会默认匹配 。因此,当没有匹配时,默认会执行 _ => {} 中的语句。

  4. match 语句有返回值,它把 匹配值 后执行的最后一条语句的结果当作返回值。

  5. _ => {} 语句是可选的,也就是说 match 语句可以没有它。

  6. 如果只有一条语句,那么每个 constant_expr2 => {} 中的 {} 是可以省略的。

9.5.2 范例

看起来 match 语句有点复杂,我们直接拿几个范例来说明下

  1. fn main(){
  2. let state_code = "MH";
  3. let state = match state_code {
  4. "MH" => {println!("Found match for MH"); "Maharashtra"},
  5. "KL" => "Kerala",
  6. "KA" => "Karnadaka",
  7. "GA" => "Goa",
  8. _ => "Unknown"
  9. };
  10. println!("State name is {}",state);
  11. }

编译运行以上 Rust 代码,输出结果如下

  1. Found match for MH
  2. State name is Maharashtra

上面的范例中,state_code 对应着语法中的 variable_expression,MH、KL、KA、GA 对应这语法中的 constant_expr1 、constant_expr2 等等。

因为我们的 variable_expression 的值为 MH 和值为 MH 的第一个 constant_expr1 匹配,因此会执行 {println!("Found match for MH"); "Maharashtra"}。 然后将执行的最后一条语句的结果,也就是 “Maharashtra” 作为整个表达式的值返回。

这样,我们的 state 变量就被赋值为 Maharashtra。

9.5.3 范例 2

上面这个范例是匹配的情况,如果不匹配,那么就会执行 _ => 语句

  1. fn main(){
  2. let state_code = "MS";
  3. let state = match state_code {
  4. "MH" => {println!("Found match for MH"); "Maharashtra"},
  5. "KL" => "Kerala",
  6. "KA" => "Karnadaka",
  7. "GA" => "Goa",
  8. _ => "Unknown"
  9. };
  10. println!("State name is {}",state);
  11. }

编译运行以上 Rust 代码,输出结果如下

  1. Unknown
  2. State name is Unknown