流程控制简单来说分为两个大类,一个做分支判断,一个做循环
分支
理论上说,所有的流程控制都可以使用if else来实现。但是仅有if else显然是不够的。
if else
if的用法非常简单,
if condition == true {
// A...
} else {
// B...
}
注意这里和JS语句的差异,if后面的条件语句,不需要使用()。 我们还可以使用if达到三目运算的效果,
fn main() {
let level = 1;
let number = if level==1 {
1
} else if level==2{
2
} else{
-1
};
println!("The value of number is: {}", number);
}
以上的代码,在JS中使用三目运算符实现为
const level =1;
const number = level===1?1:(levlel===2?2:-1)
匹配
匹配的概念,类似于JS中的switch,用来做多种场景的分支判断。 我们对比一下:
enum Color {
Red,
Blue,
Green
}
fn main() {
let color = Color::Red;
match color {
Color::Red => println!("Red"),
Color::Blue | Color::Green => {
println!("Not Red");
},
_ => println!("Nothing"),
};
}
看一下TS版本
enum Color {
Red,
Blue,
Green
}
fn main() {
const color = Color.Red;
switch (color) {
case Color.Red:console.log('red');
break;
case ( Color.Blue || Color.Green ):console.log('Not Red');
break;
default => console.log("Nothing"),
};
}
对比一下,我们发现几个不同:
- swicth后面需要用(),match不用
- switch 要使用case关键字,match不用
- switch 的每一个case后面可以加break,中断匹配。而match没有
- swicth 有一个default,表示都没有匹配到的情况下该输出什么。而match使用_达到同样的效果。
match最常用的地方,就是上一章提到的Option枚举,Option包含两个值,Some和None
let v = vec![1, 2, 3, 4, 5];
match v.get(2) {
Some(third) => println!("第三个元素是 {third}"),
None => println!("Nothing"),
}
循环
for 循环
for循环是rust最常见的循环方式,有很多场景。
指定循环次数
fn main() {
//写法1
for i in 1..=5 {//指定循环5次
println!("{}", i);
}
//写法2
for i in 1..5 {//指定循环5次
println!("{}", i);
}
}
获取循环的索引
fn main() {
let a = [4, 3, 2, 1];
// `.iter()` 方法把 `a` 数组变成一个迭代器
for (i, v) in a.iter().enumerate() {
println!("第{}个元素是{}", i + 1, v);
}
}
循环中修改元素
需要注意,在循环的过程中,实际上发生了所有权的转移。复合类型的元素,所有权被转移到了item上,因此对于复合类型的集合,需要使用引用来避免所有权的转移。如果想要对元素进行修改,则需要使用可变引用。
for item in &mut collection {
// ...
}
while循环
while的用法与TS基本一致
fn main() {
let mut n = 0;
//这里是终止条件
while n <= 5 {
println!("{}!", n);
n = n + 1;
}
}
loop循环
loop循环和while有点类似,本身是无限循环,因此需要一个终止条件。
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 5{
break counter * 2; //注意,这里的break 会把值返回出去
}
};
println!("result {}", result);
}
continue和break
两者都是控制循环的关键字,跟JS的用法差不多。 continue表示跳出当前的逻辑,直接进入下一次循环。 break表示,终止当前循环。