08-控制流

77 阅读2分钟

前言

流程控制是我们在编写程序时非常重要的一块,每个语言都会涉及到控制流程的语句,那么,在 Rust 当中,流程控制又是怎样的呢?跟其他语言有什么异同呢?我们来一起看一下吧。

If 表达式

允许根据条件来执行不同的代码分支

Rust 当中,条件的类型只能是 bool 的,这跟 TS/JS 中可以是对象、字符串、数字等不同,这一点需要特别注意一下。

同样的,我们也可以使用 else ifelse 语句来完善流程,这个比较简单,我们直接来看一个例子吧:

fn main() {
    let num = 3;

    // if 表达式
    if num < 5 {
        println!("小于 5");
    } else if num > 5 {
        println!("大于 5");
    } else {
        println!("等于 5");
    }
}

image-20240121173226571

TS/JS 不太一样的就是,我们在 ifelse if 后面的条件表达式不需要使用 () 包裹,直接写表达式即可。当然,如果你一定要写 () 其实也不会报错,能够正常运行,但 Rust 会贴心地给你一个警告提示,告诉你这个 () 是非必须的。

image-20240121173438245

看上面的执行结果,虽然这边打印出了警告提示,但依然不影响我们的程序的正常运行。不过在开发时,还是建议不加 () 比较好,这样比较 Rust

使用 match 重构多 elseif 分支

当我们的流程控制语句里面,有很多个 else if 时,我们的代码的可读性就变差了,此时,我们建议使用 match 进行重构。

fn main() {
    let num = 3;

    // if 表达式
    if num % 5 == 0 {
        println!("条件1");
    } else if num % 3 == 0 {
        println!("条件2");
    } else if num % 2 == 0 {
        println!("条件3");
    } else {
        println!("条件4");
    }
}

// 使用 match 重构分支
// 利用元组
 match (num % 5, num % 3, num % 2) {
   (0, _, _) => println!("条件1"),
   (_, 0, _) => println!("条件2"),
   (_, _, 0) => println!("条件3"),
   _ => println!("条件4"),
}

表达式

TS/JS 不一样的是,在 Rust 当中, if是一个表达式,既然是表达式,就可以将 if 语句作为右值进行赋值操作:


let num = 6;

let is_greater_than5 = if num > 5 { true } else { false };

println!("is_greater_than5: {}", is_greater_than5);

image-20240121215902525

但是需要注意的是,如果上面的代码中,ifelse 的代码块当中的值不是同一个类型的,如: let is_greater_than5 = if num > 5 { true } else { 0 };,这种用法在 Rust 当中是不允许的,因为 Rust 必须在编译时就知道 is_greater_than5 的类型是什么,如果 ifelse 当中的值的类型不同,就会导致 Rust 无法确定 is_greater_than5 的类型是什么,导致报错。

结语

至此,我们已经学习完了 Rust 当中的流程控制语句 if...elseif...else,大部分用法都是跟其他语言很类似的,当然也有一些与其他语言不一样的地方,如在 Rust 当中可以将 if 语句作为表达式当做赋值语句的右值,这个在 TS/JS 当中是不支持的。