前言
流程控制是我们在编写程序时非常重要的一块,每个语言都会涉及到控制流程的语句,那么,在 Rust 当中,流程控制又是怎样的呢?跟其他语言有什么异同呢?我们来一起看一下吧。
If 表达式
允许根据条件来执行不同的代码分支
在 Rust 当中,条件的类型只能是 bool 的,这跟 TS/JS 中可以是对象、字符串、数字等不同,这一点需要特别注意一下。
同样的,我们也可以使用 else if 和 else 语句来完善流程,这个比较简单,我们直接来看一个例子吧:
fn main() {
let num = 3;
// if 表达式
if num < 5 {
println!("小于 5");
} else if num > 5 {
println!("大于 5");
} else {
println!("等于 5");
}
}
跟 TS/JS 不太一样的就是,我们在 if 和 else if 后面的条件表达式不需要使用 () 包裹,直接写表达式即可。当然,如果你一定要写 () 其实也不会报错,能够正常运行,但 Rust 会贴心地给你一个警告提示,告诉你这个 () 是非必须的。
看上面的执行结果,虽然这边打印出了警告提示,但依然不影响我们的程序的正常运行。不过在开发时,还是建议不加 () 比较好,这样比较 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);
但是需要注意的是,如果上面的代码中,if 和 else 的代码块当中的值不是同一个类型的,如: let is_greater_than5 = if num > 5 { true } else { 0 };,这种用法在 Rust 当中是不允许的,因为 Rust 必须在编译时就知道 is_greater_than5 的类型是什么,如果 if 和 else 当中的值的类型不同,就会导致 Rust 无法确定 is_greater_than5 的类型是什么,导致报错。
结语
至此,我们已经学习完了 Rust 当中的流程控制语句 if...elseif...else,大部分用法都是跟其他语言很类似的,当然也有一些与其他语言不一样的地方,如在 Rust 当中可以将 if 语句作为表达式当做赋值语句的右值,这个在 TS/JS 当中是不支持的。