007、控制流

        先看下本篇学习内容:

        通过条件来执行重复执行某些代码 是大部分编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是 if表达式循环表达式

1. if表达式

        if表达式允许我们根据条件执行不同的代码分支。我们提供一个条件,并且做出声明:“假如这个条件满足,则运行这段代码。假如条件没有被满足,则跳过相应的代码。” 

        举个🌰:

        所有的 if表达式 都会使用 if 关键字来开头,并紧随一个判断条件。 

        需要注意的是,代码中的条件表达式必须产生一个 bool 类型的值,否则就会触发编译错误。

        举个🌰:

        这个错误表明Rust期望在条件表达式中获得一个 bool 值,而不是一个整数。与Ruby或JavaScript等语言不同,Rust不会自动尝试将非布尔类型的值转换为布尔类型。

        你必须显式地在if表达式中提供一个布尔类型作为条件。假如你想要if代码块只在数字不等于0时运行,那么我们可以将if表达式修改为如下所示的样子: 

1.1 使用 else if 实现多重条件判断

         你可以组合 ifelse 以及 else if 表达式来实现多重条件判断。例如:

         当这段程序运行时,它会依次检查每一个 if表达式,并执行条件首先被判断为真的代码片段。尽管 6 可以被 2 整除,但我们既没有看到输出 number is divisible by 2,也没有看到 else 代码块中的 number is not divisible by 4, 3, or 2

        这是因为Rust会且仅会执行第一个条件为真的代码块,一旦发现满足的条件,它便不会再继续检查剩余的那些条件分支了。当然,过多的 else if 表达式可能会使我们的代码变得杂乱无章。在后面会介绍Rust中另外一个强大的分支结构语法 match,它可以被用来应对这种情况。 

1.2 在let语句中使用if

        由于 if 是一个表达式,所以我们可以在 let 语句的右侧使用它来生成一个值。

        举个🌰:

fn main() { let condition = true; let number = if condition { 5 } else { 6 }; println!("The value of number is: {}", number); 
} 

        记住,代码块输出的值就是其中最后一个表达式的值,另外,数字本身也可以作为一个表达式使用。

        在上面的例子中,整个 if 表达式的值取决于究竟哪一个代码块得到了执行。这也意味着,所有if分支可能返回的值都必须是一种类型的。

        在示例中,if 分支与 else 分支的结果都是 i32 类型的整数。假如分支表达式产生的类型无法匹配,那么就会触发编译错误,如下所示: 

fn main() { let condition = true;let number = if condition { 5 } else { "six" }; println!("The value of number is: {}", number); 
} 

2. 使用循环重复执行代码

        Rust提供了3种循环:loopwhile for。下面让我们来逐一讲解一下。 

2.1 使用loop重复执行代码

        我们可以使用 loop 关键字来指示Rust反复执行某一块代码,直到我们显式地声明退出为止。 

        你可以在循环中使用 break 关键字来通知程序退出循环。

2.2 从loop循环中返回值 

        loop 循环可以被用来反复尝试一些可能会失败的操作,比如检查某个线程是否完成了自己的工作。

        不管怎么样,你也许会需要将该操作的结果传递给余下的代码。为了实现这一目的,我们可以将需要返回的值添加到break表达式后面,也就是我们用来终止循环的表达式后面。

        接着,你就可以在代码中使用这个从循环中返回的值了,如下所示: 

fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!("The result is {}", result); 
} 

        我们在循环前声明了变量 counter 并将其初始化为 0。接着,我们声明了一个名为 result 的变量来存储循环中返回的值。

        该循环会在每次迭代时给 counter 变量中的值加 1,并检查计数器是否已经增加至 10。一旦条件符合,我们便使用 break 关键字返回 counter * 2

        在循环之后,我们还使用了一个分号来结束当前的语句,这会将循环的返回结果赋值给 result。最终,我们会打印出 result 内存储的值,在本例中,也就是 20

2.3 while条件循环 

         while 会在条件为真时重复执行代码,举个🌰:

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

        这段程序会循环执行3次,每次将数字减1,在循环结束后打印出特定消息并退出。

2.4 使用for来循环遍历集合 

        你可以使用 while 结构来遍历诸如数组之类的集合中的元素,举个🌰:

        在这段程序中,代码会对数组中的所有元素进行计数。它从索引 0 开始循环,直到数组的最后一个索引(这时,条件 index < 5 不再为真)。运行这段代码会将数组中的每一个元素都打印出来。 

        需要指出的是,类似的代码非常容易出错,可能会因为使用了不正确的索引长度而使程序崩溃。

        而且,由于我们增加了运行时的代码来对每一次遍历做出条件判断,所以这段代码的运行效率会比较低。

        你可以使用 for 循环这种更简明的方法来遍历集合中的每一个元素。举个🌰:

        运行这段代码,我们会看到与上上面例子同样的输出。但更重要的是,我们增强了代码的安全性,不会出现诸如越界访问或漏掉某些元素之类的问题。 

        for 循环的安全性和简捷性使它成为了Rust中最为常用的循环结构。即便是为了实现示例中循环特定次数的任务,大部分的Rust开发者也会选择使用 for 循环。

        我们可以配合标准库中提供的 Range 来实现这一目的,它被用来生成从一个数字开始到另一个数字结束之前的所有数字序列。

        arr.iter() 返回一个迭代器,它逐个访问数组中的元素。在每次循环迭代中,元素的值被赋给变量 x

        下面的代码使用了一个还未介绍过的方法 rev 来翻转 Range 生成的序列:

        最后,码字不易,如果大家能给我一个赞,我也会动力满满,万分感谢你们的支持! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/311371.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【node-express】在commonjs的项目中使用esm和ts开发的sdk

在commonjs的项目中使用esm和ts开发的sdk 效果实现步骤 效果 在一些demo中, 大部分代码是commonjs规范开发的&#xff0c;但是要用到的sdk是ts开发的并且仅支持esm&#xff0c; 又不想配置很复杂的工程项目&#xff0c;可以这么做。如果你有更好的建议&#xff0c;希望能得到你…

SPI机制原理+使用

一、概述 SPI全称&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制&#xff1b;SPI机制提供了组件发现和注册方式&#xff0c;可以为应用程序提供灵活的插件机制&#xff0c; 主要原理&#xff1a;接口 反射 配置文件。 二、…

如何实现WinApp的UI自动化测试?

WinApp&#xff08;WindowsAPP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinApp&…

【SpringBoot】SwaggerKnif4j接口文档集成

[TOC] 序&#xff1a;接口文档 ​ 在开发过程中&#xff0c;接口文档是非常重要的一环&#xff0c;在 Spring Boot 中&#xff0c;我们可以通过集成第三方来实现接口文档的自动生成。 ​ 通过注解来描述接口&#xff0c;然后根据这些注解自动生成接口文档&#xff0c;它不仅…

4.Python数据序列

Python数据序列 一、作业回顾 1、面试题 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 白话文:有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3,用7去除剩2个,问这个数是多少?1 ~ 100以内的整数 while循环: # 初始化计数器 i = …

python编程从入门到实践(1)

文章目录 2.2.1命名的说明2.3字符串2.3.1使用方法修改字符串的大小写2.3.2 在字符串中使用变量2.3.3 制表符 和 换行符2.5.4删除空白2.5.5 删除前缀&#xff0b;后缀 2.2.1命名的说明 只能包含&#xff1a;字母&#xff0c;下划线&#xff0c;数字 必须&#xff1a;字母&#…

【Swagger】常用注解的使用、SpringBoot的整合及生产环境下屏蔽Swagger

一、引言 1、什么是Swagger&#xff1f; Swagger是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化RESTful风格的Web服务。它使得部署管理和使用功能强大的API从未如此简单。Swagger让文件的方法、参数和模型紧密集成到服务器端的代码&#xff0c;允许API始终保…

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加&#xff0c;家庭火灾发生的频率越来越高。火灾报警…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性&#xff1f; 105.什么是缓存穿透&#xff0c;什么是缓存雪崩&#xff1f;怎么解决&#xff1f; 106.如何对数据库进行优化&#xff1f; 107.使用索引时有哪些原则&#xff1f; 108.存储过程如何进行优化&#xff1f; 109.说说…

HTML使用JavaScript的三种方式

要使用 JavaScript&#xff0c;你可以在 HTML 文件中的 <script> 标签中编写代码&#xff0c;或者将代码保存到一个单独的 .js 文件中并在 HTML 文件中引入。以下是一些常用的 JavaScript 使用方式&#xff1a; 内联 JavaScript&#xff1a;在 HTML 文件的 <script&g…

Hive实战:统计总分与平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、创建Hive表&#xff0c;加载HDFS数据文件…

劫持最新版 QQNT / QQ / TIM 客户端 ClientKeys

针对 TX官网 最新发布的 QQNT 9.9.6 与 QQ 9.7.21 新版本客户端全面更新截取代码 大伙应该都知道自从 QQ 9.7.20 版本起就已经不能通过模拟网页快捷登录来截取 Uin 跟 Clientkey 数据&#xff0c;而此次 TX官网 最新发布的 QQNT 9.9.6 与 QQ 9.7.21 可谓是采用了全新的技术、全…