前端同学的rust入门(六)--流程控制

79 阅读2分钟

流程控制简单来说分为两个大类,一个做分支判断,一个做循环

分支

理论上说,所有的流程控制都可以使用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"),
    };
}

对比一下,我们发现几个不同:

  1. swicth后面需要用(),match不用
  2. switch 要使用case关键字,match不用
  3. switch 的每一个case后面可以加break,中断匹配。而match没有
  4. 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表示,终止当前循环。