• 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 在流程控制方面,还是有不少灵活用法的,我们可以多试一试,体会体会。

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

  • 相关阅读:
    372. Super Pow
    224. Basic Calculator + 227. Basic Calculator II
    263. Ugly Number + 264. Ugly Number II + 313. Super Ugly Number
    169. Majority Element
    225. Implement Stack using Queues + 232. Implement Queue using Stacks
    551. Student Attendance Record I + Student Attendance Record II
    765. Couples Holding Hands
    547. Friend Circles
    535. Encode and Decode TinyURL
    87. Scramble String
  • 原文地址:https://www.cnblogs.com/liuhe688/p/13416082.html
Copyright © 2020-2023  润新知