Rust: 流程控制

我们写代码时业务逻辑的实现,依赖于编程语言的流程控制结构。今天来介绍一下 Rust 中的流程控制结构。

if语句

if 语句是最基本的控制结构了,Rust 的 if 语句如下面代码所示:

fn main() {
    let number = 3;
    
    if number > 5 {
        println!("number > 5");
    } else if number > 3 {
        println!("number > 3");
    } else {
        println!("number <= 3");
    }
}

和 C/C++/Java 这些语言大致相同,但差异在于,if 语句的条件不使用括号包裹。由于 Rust 是强类型语言,所以 if 语句的条件也必须是 bool 类型。

除了上面这种基本形式之外,if 语句还有下面新奇的用法:

fn main() {
    let my_total = 150;
    
    // 满100减30
    let my_payment = if my_total >= 100 {
        my_total - 30
    } else {
        my_total
    }; // 注意这里必须加上分号
    
    println!("{}", my_payment); // 120
}

Rust 没有提供三元表达式,所以我们要使用 if 语句来完成,在 if 分支和 else 分支内部,直接放置一个表达式,表示返回值。需要注意的是,分支内的表达式不能加分号,类型也必须一致。

match语句

大部分编程语言都提供了 switch 这样的语句结构,来提供对指定变量的分支匹配,Rust 提供了相似的 match 功能,比传统的 switch 要强大的多:

fn main() {
    let number = 3;
    
    match number {
        0 => println!("match 0"),
        1 | 3 => println!("match 1 or 3"),
        5..=7 => println!("match [5, 7]"),
        n @ 9 => println!("match {}", n),
        _ => println!("default"),
    }
}

从上面代码可以看出,match 语句的匹配格式有很多种,可以匹配指定值,可以匹配多个值中的一个,也可以匹配某个范围内的值,还可以在匹配时定义变量,最后,default 分支使用下划线 _ 表示。

需要注意的是,5..=7 这个表达式表示的是 5 到 7 的闭区间,也就是说包含 7 这个值。

除了上述代码之外,match 语句还能返回结果值,用于为变量赋值,我们只需确保每个匹配的分支都返回一个表达式即可:

fn main() {
    let is_real = true;
    
    let result = match is_real {
        true => "real",
        false => "not real",
    }; // 注意加分号
    
    println!("{}", result);
}

循环结构

Rust 也使用 for 来定义循环结构,但稍微有些不同:

fn main() {
    // 循环表达式 不包含最后一个值
    for n in 0..10 {
        if n % 5 == 0 {
            println!("-----");
        }
        println!("{}", n);
    }
}

运行上面代码,打印结果如下:

-----
0
1
2
3
4
-----
5
6
7
8
9

如果在范围表达式的后面追加一个 = 号,和上面 match 匹配分支中的一样,表示包含最后的边界,即这个范围是闭区间:

fn main() {
    // 加个等号 包含最后一个值
    for n in 0..=10 {
        if n % 5 == 0 {
            println!("-----");
        }
        println!("{}", n);
    }
}

再次运行代码,打印结果如下:

-----
0
1
2
3
4
-----
5
6
7
8
9
-----
10

除了 for 循环之外,Rust 还提供了 loop 循环,不过在使用 loop 时,需要我们主动地根据条件退出当前循环:

fn main() {
    let mut count = 0;

    loop {
        if count >= 10 {
            break;
        }
        
        println!("{}", count);
        
        // Rust没有提供自增自减表达式
        count += 1;
    }
}

和 match 相似,loop 结构也可以返回一个最终结果。只要在 break 时附带一个结果,我们就能获取到,并将其赋给一个变量:

fn main() {
    let mut number = 1;
    
    // 求同时能被5、13、15整除的数
    let result = loop {
        let matched = number % 5 == 0 
                && number % 13 == 0 
                && number % 15 == 0;
        
        if matched {
            // 退出循环时返回最终结果
            break number;
        }
        
        number += 1;
    }; // 同样 注意加分号
    
    println!("{}", result); // 195
}

当然,我们还可以使用 while 结构,提前根据条件决定,是否要继续执行循环,这种方式相信大家都不会陌生:

fn main() {
    let mut count = 0;

    while count < 10 {
        println!("{}", count);
        
        count += 1;
    }
}

总的来说,Rust 在流程控制方面,还是有不少灵活用法的,我们可以多试一试,体会体会。

关于流程控制,就先介绍到这里了。

posted @ 2019-11-18 19:07  liuhe688  阅读(503)  评论(0编辑  收藏  举报