logoProsperBao

Rust 控制流

2022-09-13 06 · 10min

控制流

根据条件执行/重复某些代码。

if 表达式

在 Rust 中,if 的条件必须是一个显示的 bool 类型。Rust 并不会自动尝试将非布尔类型转换为布尔类型。

fn main() {
    let number = 3;

    if number {
    // ^^^^^^ expected `bool`, found integer
        println!("number was three");
    }
}

必须显示的使用表达式来获取一个 bool 类型的值。

fn main() {
    let number = 3;

    if number != 0 {
        println!("number was something other than zero");
    }
}

else/else if

和大部分语言一样,都有 elseelse if 语句。但是在 else if 数量较多的情况下会显得代码杂乱无章。

Rust 提供了一个模式匹配的方式来解决这个问题。

在 let 语句中使用 if

在 Rust 中 if 是一个表达式,可以直接在 let 赋值中使用。类似于三元表达式。

在表达式中返回的两个类型必须一致,否则无法通过编译。

fn main() {
    let condition = true;

    let number = if condition { 5 } else { "six" };

    println!("The value of number is: {number}");
}

循环

Rust 中提供了三种循环方式:loopwhilefor

loop

除非手动停止/跳出循环,否则会一直执行下去

fn main() {
    loop {
        println!("again!");
    }
}

loop 可以当作一个表达式赋值给变量,但是中断 loop 只能使用 break, 使用 return 会中断当前函数执行,也不可以直接写一个表达式。

continue 可以和大部分语言一样,跳过当前循环,继续下一次循环。

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2; // OK
            counter * 2; // unreachable statement
            return counter * 2; // expected `()`, found integer -> main函数需要一个空元组表达式,但是获取到了数字类型
        }
    };

    println!("The result is {result}");
}

循环标签

可以在 loop 标签前为标签打上一个标签接着可以在 breakcontinue 后面跟上循环标签来控制循环。

以单引号开头冒号结尾 'loop_flag:

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;
        
        'counting_down: loop {
            if remaining == 6 {
                break;
            }
            
            if remaining == 8 {
                remaining -= 1;
                continue;
            }

            if count == 2 {
                break 'counting_up;
            }
            
            println!("remaining = {remaining}");
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

while

while 可以使用 loop 来完成,但是会多一些不必要的代码,所以 Rust 有内置的 while 循环。

使用方式和大部分程序一样为 true 就继续循环否则就跳出循环。

在内部也可以使用 breakcontinue 来控制循环。循环标签也是通用的。

while 不可以和 loop 一样使用 value break

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number -= 1;
    }

    println!("LIFTOFF!!!");
}
fn main() {
    let mut count = 0;
    let test = while count < 10 {
        if count == 5 {
            break 20;
         // ^^^^^^^^ can only break with a value inside `loop` or breakable block
         // help: use `break` on its own without a value inside this `while` loop
        }
        count += 1;
    };
    
    println!("count: {count}");
}

for

可以直接通过 while 来实现,但是没有必要,除了多了一些不必要的代码,没什么好处,Rust 也内置了 for

可以直接用来遍历集合中的元素

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}

可以用 rang 生成一个元素集合然后来遍历

fn main() {
    for number in (1..4).rev() {
        println!("{number}!");
    }
    println!("LIFTOFF!!!");
}