Wang's blog

三、控制流

Published on

分支语句(if-else)

分支语句if-else的用法基本与其它语言相同。

// 单独使用if,使用if-else,或者使用if-else if-else等均可
if n < 0 {
    print!("{} is negative", n);
} else if n > 0 {
    print!("{} is positive", n);
} else {
    print!("{} is zero", n);
}

// if-else语句是表达式,可以作为值使用,但是所有分支的返回值类型必须相同
let big_n =
    if n < 10 && n > -10 {
        println!(", and is a small number, increase ten-fold");
        10 * n
    } else {
        println!(", and is a big number, halve the number");
        n / 2
    };

循环语句

无限循环(loop)

无限循环语句,只能使用break或return退出。

let mut count = 0u32;
loop {
    count += 1;
    if count == 5 {
        println!("OK, that's enough");
        // 使用break退出
        break;
    }
}

loop语句可以作为表达式,通过使用break返回值。

let result = loop {
    counter += 1;
    if counter == 10 {
        // 使用break返回值
        break counter * 2;
    }
};

条件循环(while)

在条件为真时循环。

let mut number = 3;
while number != 0 {
    println!("{number}!");
    number -= 1;
}

迭代循环(for)

对一个迭代器的全部值进行迭代循环。

let a = [10, 20, 30, 40, 50];
for element in a {
    println!("the value is: {element}");
}

多重循环与标签

可以为循环定义标签,这样在多重循环中,就可以使用break或continue跳出多重循环。

'outer: loop {
    println!("Entered the outer loop");
    'inner: loop {
        println!("Entered the inner loop");

        // 此break只退出内层循环
        break;

        // 此break退出外层循环
        break 'outer;
    }
}

模式匹配

match

列出所有可能的分支,并从中选择匹配的分支执行。类似C中的switch语句,但是更加安全与强大。

let number = 13;
match number {
    // 匹配一个值
    1 => println!("One!"),
    // 匹配多个值
    2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
    // 匹配一个范围
    13..=19 => println!("A teen"),
    // 匹配其它所有情况
    _ => println!("Ain't special"),
}

if-let

在一些简单的情况下,使用match会使代码变得复杂,不易阅读。此时使用if-let更加简洁。

// 只处理一个分支
if let Some(i) = number {
    println!("Matched {:?}!", i);
}

// 处理一个分支以及其它所有情况
if let Some(i) = letter {
    println!("Matched {:?}!", i);
} else {
    println!("Didn't match a number. Let's go with a letter!");
}

while-let

与if-let类似,用于循环语句中。

let-else

如果模式能够匹配则使用let进行绑定,否则执行一个发散函数(break, return, panic!)

let Ok(count) = u64::from_str(count_str) else {
    panic!("Can't parse integer: '{count_str}'");
};