RUST 学习日记 第17课 ——流程控制

RUST 学习日记 第17课 ——流程控制


0x00 回顾与开篇

有关Rust数据类型的知识暂时告一段落了,从这节开始讲解Rust中的流程控制。在Rust中控制代码执行流程有两种方式——条件判断和循环。

0x01 条件判断

if表达式在任何语言里面都很常见,其形式如下:

if condition1 {

block1

} else if condition2 {

block2

} else {

block3

}

所有的condition都是一个bool型的表达式。Rust并不像C语言那样,非0值表示true,0值表示falsecondition的花括号并不是必须的。

下面通过一道题来练习下:求一个数对应的星期。将一个数对7取余,如果是0,则选择的是周日,以此类推,如果是6则选择的是周6。

示例代码如下:

// 求一个数对应的星期。将一个数对7取余,如果是0,则选择的是周日,以此类推,如果是6则选择的是周6
    let week: u32 = 1;

    if week % 7 == 0 {
        println!("您选择的是周日!")
    } else if week % 7 == 1 {
        println!("您选择的是周一!")
    } else if week % 7 == 2 {
        println!("您选择的是周二!")
    } else if week % 7 == 3 {
        println!("您选择的是周三!")
    } else if week % 7 == 4 {
        println!("您选择的是周四!")
    } else if week % 7 == 5 {
        println!("您选择的是周五!")
    } else {
        println!("您选择的是周六!")
    }

代码运行结果如下:

您选择的是周一!

0x02 循环

循环,顾名思义,表示重复执行某一段代码。在Rust中,共有3中循环形式,分别是loop,while,for..in..循环。控制循环的语句有两个:break和continue。

break和continue

break和continue都用来循环控制。break用于直接退出循环,continue则表示跳出当前轮次的循环,不在执行continue后的代码,但是它仍然会再次执行调节判断,决定是否执行下次循环。

loop循环

重复执行,永远不会结束,如果没有退出条件,那就是死循环了。使用起来比较简单。

其签名形式为:

loop {

// 要执行循环的代码

}

示例代码如下:

    let mut count = 0;

    loop {
        count += 1;

        // 计数器为5则跳出循环
        if count == 5 {
            break;
        }
    }

    println!("count = {}", count);

代码运行结果:

loop循环 -> count = 5
while循环

while后面跟一个表达式,如果表达式的值为true,则会执行循环。

示例代码如下:

    let mut count = 0;

    while count < 5 {
        count += 1;
    }

    println!("while循环 -> count = {}", count);

代码运行结果:

while循环 -> count = 5
for..in..循环######

重复执行指定次数的循环。

示例代码如下:

    let mut count = 0;

    for i in 1..=5 {
        count = i
    }

    println!("for..in..循环 -> count = {}", count);

代码运行结果:

for..in..循环 -> count = 5

前面示例代码都是用break来做示例的,接下来练习下continue的用法。看下下面的代码运行后,count的最终结果是多少呢?

示例代码如下:

    let mut count = 1;
    while count < 5 {
        if count % 2 == 0 {
            count += 5;
            continue;
        }
        count += 1;
    }

代码运行结果:

continue test -> count = 7

解释:

代码开始,count赋值为1,然后经过while循环,当count < 5执行循环。

循环体内,如果count % 2 == 0,执行条件代码块。当然,第一次循环count == 1,显然count % 2 != 0 不满足条件,继续执行count += 1,得到count == 2

第二次循环,count == 2,满足count % 2 == 0,执行 count += 5,得到count == 7,然后continue,不再执行循环体内下面的代码,转而执行第三次循环。

第三次循环,count == 7,不满足count < 5这个条件,退出循环,输出count的值为7。

0x03 match模式匹配

match

在Rust中,并没有其它语言的switch语句,取而代之的是match模式匹配。match用来判断当前值是否匹配一系列模式中的某一个。模式可以由字面量,变量,通配符来构成。与其它语言中的switch的类似,每一个模式即是一个分支。

PS:在Rust中,match模式匹配要求穷举所有的可能性,否则会导致程序报错。可以在一系列模式最后添加_通配符,表示没有指定的其它所有模式(相当于Java中的default)。

示例代码如下(将第一个示例转为match实现):

// 求一个数对应的星期。将一个数对7取余,如果是0,则选择的是周日,以此类推,如果是6则选择的是周6
    let week: u32 = 6;
    match week % 7 {
        0 => { println!("您选择的是周日!") }
        1 => { println!("您选择的是周一!") }
        2 => { println!("您选择的是周二!") }
        3 => { println!("您选择的是周三!") }
        4 => { println!("您选择的是周四!") }
        5 => { println!("您选择的是周五!") }
        6 => { println!("您选择的是周六!") }
        _ => { println!("未知!") }
    }

代码运行结果:

您选择的是周六!
if let 和 while let

在某些场合使用match可能会显得有些繁琐,因此在Rust中也提供了if letwhile let在某些场景下替换match

if let

if let的形式如下:

if let pattern = expr {

  block1

} else {

  block2

}

使用if let进行匹配时要注意,patternexpr直接是单=号。还是拿本章开始的那个例子来解释,假设我只是想对周五这一天做匹配妖气,而对其它没有任何要求,我们就可以使用if let进行改造。

示例代码如下:

    let week: u32 = 5;
    if let 5 = week % 7 {
        println!("您选择的是周五!");
    } else {
        println!("未知!");
    }

代码运行结果:

您选择的是周五!
while let

while let的形式如下:

while let pattern = expr {

  block

**}

现在有个要求需要逆向依次输出向量中的值。

使用loop和match实现:

    let mut vec = vec![1, 3, 5, 7, 9];
    loop {
        match vec.pop() {
            None => {
                break;
            }
            Some(value) => {
                print!("{} ", value);
            }
        }
    }

改造为while let:

    let mut vec = vec![1, 3, 5, 7, 9];
    while let Some(value) = vec.pop() {
        print!("{} ", value);
    }

代码运行结果:

match loop:
9 7 5 3 1 
while let:
9 7 5 3 1 

显而易见,经过while let改造过的代码显得比较简洁。这其实感觉就像是Rust给我们的语法糖。

0x04 小结

本节介绍了流程控制,循环,match匹配。最后还介绍了使用while let和if let在某些场景下可以简化代码。相比较而言,这节课还是比较简单和轻松的。

0x05 本节源码

017 · StudyRust - 码云 - 开源中国 (gitee.com)

下节预告——函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355