007、控制流
先看下本篇学习内容:
通过条件来执行 或 重复执行某些代码 是大部分编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是 if表达式 与 循环表达式。
1. if表达式
if表达式允许我们根据条件执行不同的代码分支。我们提供一个条件,并且做出声明:“假如这个条件满足,则运行这段代码。假如条件没有被满足,则跳过相应的代码。”
举个🌰:
所有的 if表达式 都会使用 if 关键字来开头,并紧随一个判断条件。
需要注意的是,代码中的条件表达式必须产生一个 bool 类型的值,否则就会触发编译错误。
举个🌰:
这个错误表明Rust期望在条件表达式中获得一个 bool 值,而不是一个整数。与Ruby或JavaScript等语言不同,Rust不会自动尝试将非布尔类型的值转换为布尔类型。
你必须显式地在if表达式中提供一个布尔类型作为条件。假如你想要if代码块只在数字不等于0时运行,那么我们可以将if表达式修改为如下所示的样子:
1.1 使用 else if 实现多重条件判断
你可以组合 if、else 以及 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种循环:loop、while 和 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 生成的序列:
最后,码字不易,如果大家能给我一个赞,我也会动力满满,万分感谢你们的支持!
相关文章:

007、控制流
先看下本篇学习内容: 通过条件来执行 或 重复执行某些代码 是大部分编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是 if表达式 与 循环表达式。 1. if表达式 if表达式允许我们根据条件执行不同的代码分支。我们提供一个条件,并且做出…...

将学习自动化测试时的医药管理信息系统项目用idea运行
将学习自动化测试时的医药管理信息系统项目用idea运行 背景 学习自动化测试的时候老师的运行方式是把医药管理信息系统项目打包成war包后再放到tomcat的webapp中去运行,于是我想着用idea运行会方便点,现在记录下步骤方便以后查找最开始没有查阅资料&am…...
k8s 的YAML文件详解
一、yaml文件简介 Kubernetes只支持YAML和JSON格式创建资源对象,JSON格式用于接口之间消息的传递,适用于开发;YAML格式用于配置和管理,适用于云平台管理,YAML是一种简洁的非标记性语言。 1)yaml的语法规则&…...

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析
NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人:最好资料就是上面三份资料,可以通过官网明确的获取一手信息,你所遇到的99%的问题都可以找到,明确的解决方案,建议最好看…...

『精』CSS 小技巧之BEM规范
『精』CSS 小技巧之BEM规范 文章目录 『精』CSS 小技巧之BEM规范一、什么是BEM?二、BEM要怎么用?三、不用BEM会少个胳膊吗?💊四、Sass与BEM的结合🎈五、块与修饰符应放在一块👿参考资料💘推荐博…...

vue3-12
需求是用户如果登录了,可以访问主页,如果没有登录,则不能访问主页,随后跳转到登录界面,让用户登录 实现思路,在用户登录之前做一个检查,如果登录了,则token是存在的,则放…...

操作系统期末复习
分段存储管理方式 某采用段式存储管理的系统为装入主存的一个作业建立了如下段表: 段号 段长 主存起始地址 0 660 210 1 140 3300 2 100 90 3 580 1237 4 960 1959 (1)计算该作业访问[0,432],[1&am…...

element el-table实现可进行横向拖拽滚动
【问题】表格横向太长,表格横向滚动条位于最底部,需将页面滚动至最底部才可左右拖动表格,用户体验感不好 【需求】基于elment的el-table组件生成的表格,使其可以横向拖拽滚动 【实现】灵感来源于这篇文章【Vue】表格可拖拽滚动&am…...

【兔子王赠书第14期】《YOLO目标检测》涵盖众多目标检测框架,附赠源代码和全书彩图!
文章目录 写在前面YOLO目标检测推荐图书本书特色内容简介作者简介 推荐理由粉丝福利写在后面 写在前面 小伙伴们好久不见吖,本期博主给大家推荐一本关于YOLO目标检测的图书,该书侧重目标检测的基础知识,包含丰富的实践内容,是目标…...
WPF 基础入门(样式)
3.1 一般样式 <Grid Margin"10"><TextBlock Text"Style test" Foreground"Red" FontSize"20"/> </Grid> 3.2内嵌样式 直接在控件上定义样式,如下所示: <Grid Margin"10">…...

Java ArrayList在遍历时删除元素
文章目录 1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…...

多模态大模型的前世今生
1 引言 前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作…...

Android studio 花式按键
一、activity_main.xml代码: <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…...

使用spring boot实现异常的统一返回
在这个前后端分离的时代,一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式,不再出现服务器500的错误。 新建一个spring boot项目,并导入knife4j的依赖。 写一个controller控制器,用来是…...

2023-12-11 LeetCode每日一题(最小体力消耗路径)
2023-12-11每日一题 一、题目编号 1631. 最小体力消耗路径二、题目链接 点击跳转到题目位置 三、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格…...
PID为1的僵尸进程的产生及清理
父进程PID为1的僵尸进程通常是由init系统(在Linux系统中通常是systemd)产生的。这种情况通常发生在以下几种情况: 子进程结束,但其父进程没有正确地调用wait()或waitpid()系统调用来获取子进程的退出状态。在这种情况下࿰…...

043、循环神经网络
之——RNN基础 杂谈 第一个对于序列模型的网络,RNN。 正文 1.潜变量自回归模型 潜变量总结过去的信息,再和当前信息一起结合出新的信息。 2.RNN 循环神经网络将观察作为x,与前层隐变量结合得到输出 其中Whh蕴含了整个模型的时序信息…...
node使用nodemonjs自动启动项目
安装 npm install -g nodemon使用方法 我这里用的是electron项目为例package.json配置 {"name": "my-electron-app","version": "1.0.0","description": "Hello World!","main": "main.js"…...

Ts自封装WebSocket心跳重连
WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行双向实时通信。 所谓心跳机制,就是在长时间不使用WebSocket连接的情况下,通过服务器与客户端之间按照一定时间间隔进行少量数据的通信来达到确认连接稳定的手…...

【unity学习笔记】捏人+眨眼效果+口型效果
一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型(.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。(VRM-0.116.0_0f6c) 3.将univrm导入到工程中(assets)。 三…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...