当前位置: 首页 > news >正文

【Rust自学】3.6. 控制流:循环

3.6.0. 写在正文之前

欢迎来到Rust自学的第三章,一共有6个小节,分别是:

  • 变量与可变性
  • 数据类型:标量类型
  • 数据类型:复合类型
  • 函数和注释
  • 控制流:if else
  • 控制流:循环(本文)

通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。

喜欢的话记得点赞、收藏加关注哦,想要跟着学下去记得关注专栏哦

3.6.1. Rust的循环

Rust一共提供了三种循环:

  • loop
  • while
  • for

3.6.2. loop循环

loop关键字告诉Rust要反复执行一段代码,除非喊停。以下是一个例子,它会不断打印6657 up up!

fn main(){loop {println!("6657 up up!");}
}

可以在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,在每次循环中递增 1。
  • 当 counter 等于 10 时,break 退出循环,同时返回 counter * 2(即 20)。
  • loop 是一个表达式,其返回值是 break 的返回值,因此可以直接赋值给 result。
  • result 最终打印出 20。

代码特点:

  • Rust 的 loop 是表达式,可以直接绑定结果到变量。
  • break 可以携带返回值(这里是 counter * 2),并作为 loop 的结果。
  • let 语句要求赋值表达式后需要加分号(;),因此 loop 的结束大括号 } 后需加分号。

3.6.3. while条件循环

while循环在每次执行循环体之前都要判断一次条件

fn main() {let mut countdown = 10; // 倒计时从10开始println!("Rocket Launch Countdown:");while countdown > 0 {println!("T-minus {}...", countdown);countdown -= 1; // 每次减少1}println!("🚀 Liftoff!");println!("Huston, we have a problem.");
}

这是一个简单的while循环示例代码,其运行结果是:

Rocket Launch Countdown:
T-minus 10...
T-minus 9...
T-minus 8...
T-minus 7...
T-minus 6...
T-minus 5...
T-minus 4...
T-minus 3...
T-minus 2...
T-minus 1...
🚀 Liftoff!
Huston, we have a problem

3.6.4. 使用for循环遍历集合

当然也可以使用whileloop来遍历集合,但是易错且低效
这是个使用while的例子:

fn main() {let numbers = [10, 20, 30, 40, 50];let mut index = 0;println!("Using while loop:");while index < 5 {println!("Number at index {}: {}", index, numbers[index]);index += 1;}
}

使用while时极有可能造成索引越界触发panic!,而且运行速度较慢,因为每次都要检查index < 5这个条件。

这是个使用for的例子(实现同样的效果):

fn main() {let numbers = [10, 20, 30, 40, 50];println!("Using for loop:");for (index, number) in numbers.iter().enumerate() {println!("Number at index {}: {}", index, number);}
}

1. numbers.iter()

  • 调用集合 numbers.iter() 方法,创建一个不可变的迭代器,用于逐个访问集合中的元素。在 Rust 中,for 循环并不直接操作集合,而是操作实现了 Iterator 特征的迭代器。.iter() 是 Vec(或其他集合)常用的方法,生成一个指向集合元素的引用的迭代器。使用for循环简洁紧凑,它可以针对集合中的每个元素来执行代码。由于for循环的安全性、简洁性,所以它在Rust中使用最多

2. .enumerate()
• 为迭代器的每个元素附加一个索引。索引从 0 开始,是一个usize类型的值。.enumerate() 将迭代器的每个元素包装成 (index, value) 的形式,其中:index 是元素在集合中的索引。value 是当前迭代器指向的元素。.enumerate() 返回一个新的迭代器,迭代出的元素类型是 (usize, &T),其中 T 是集合中元素的类型。在这里,numbers 是一个Vec<i32>,因此&T&i32

3. for (index, number) in ...
• for 循环支持解构元组,(index, number) 表示我们直接将 enumerate() 提供的 (usize, &T)元组解构成两个变量:index:当前元素的索引。number:当前元素的引用(不可变)。

假设 numbers[10, 20, 30, 40, 50],执行时的过程如下:

  1. 调用 numbers.iter() 创建迭代器。
  2. 调用 .enumerate(),生成 (索引, 元素引用) 的迭代器
  3. for 循环解构出索引和元素:
    • 第一次循环:index = 0, number = &10
    • 第二次循环:index = 1, number = &20
    • 第三次循环:index = 2, number = &30
  4. 打印 indexnumber,输出每个元素的索引和值。

由于使用for循环呢的安全、简洁性,所以它在Rust里使用最多。

3.6.5. Range

Range由标准库提供。用户可以通过Range生成它们之间的数字(不含结束)。使用rev方法可以反转Range

fn main() {println!("Rocket Launch Countdown:");for countdown in (1..=10).rev() {println!("T-minus {}...", countdown);}println!("🚀 Liftoff!");println!("Huston, we have a problem.");
}

这个例子使用for循环、Rangerev实现了上文while函数所实现的火箭倒数

代码解析

  1. (1…=10):
    • 这是一个 Range,表示从 1 到 10(包含 10)。
    • …= 是包含上限的范围操作符。
  2. .rev():
    • 反转迭代器,生成一个从 10 到 1 的递减序列。

相关文章:

【Rust自学】3.6. 控制流:循环

3.6.0. 写在正文之前 欢迎来到Rust自学的第三章&#xff0c;一共有6个小节&#xff0c;分别是: 变量与可变性数据类型&#xff1a;标量类型数据类型&#xff1a;复合类型函数和注释控制流&#xff1a;if else控制流&#xff1a;循环&#xff08;本文&#xff09; 通过第二章…...

【第八节】git与github

目录 前言 一、 远程仓库概述 二、 创建、配置、连接推送远程仓库 2.1 在 GitHub 上创建仓库 2.2 生成 SSH Key 2.3 验证 SSH 连接 2.4 本地初始化仓库 2.5 推送本地仓库到远程 三、 管理远程仓库 3.1 查看远程仓库 3.2 提取远程仓库更新 3.3 推送更新到远程仓库 …...

win如何访问Linux数据库(本地)

对于数据库的学习&#xff0c;我们都是在localhost主机上进行操作&#xff0c;当我们在Linux系统上安装数据库时&#xff0c;我们就有了尝试在win上去访问Linux上的数据库的想法。 数据库中的用户&#xff1a; 我们都知道数据库中顶级的用户为root&#xff0c;在做创建用户的联…...

Windows设置所有软件默认以管理员身份运行

方法一、修改注册表 winr打开运行&#xff0c;输入“regedit”打开注册表&#xff1b; 打开此路径“计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem”&#xff1b; 在右侧找到“EnableLUA”&#xff0c;将其值改为0&#xff0c;重启电脑。 …...

前端 计算发布时间(如“1小时前”、“3天前”等)

这样效果&#xff0c;在c端比较常见&#xff0c;通过前端也可以处理 代码如下&#xff1a; // 计算 小时timeAgo(createTime) {// 将 createTime 字符串转换为 Date 对象 const createDate new Date(createTime);const now new Date();const diffInSeconds Math.floor((now…...

shardingjdbc 4.0.0 seata分布式事务Failed to fetch schema问题

报错 12-18 15:18:35.931 [ERROR] [i.s.r.d.s.s.cache.AbstractTableMetaCache:63 ] [traceId:][spanId:] - get table meta of the table wh_stock_log error: Failed to fetch schema of xxx java.sql.SQLException: Failed to fetch schema of wh_stock_logat io.seata.r…...

罗德与施瓦茨NRT2功率反射仪,NRT2通过式功率计

罗德与施瓦茨NRT2功率反射仪NRT2 通过式功率计 描述 定向/通过式功率传感器在线测量正向和反向功率。在安装、维修和监控发射机、天线和射频发生器时&#xff0c;需要进行这些测量。R&SNRT系列由R&SNRT2功率反射计及各种R&SNRT Zxx定向功率传感器。 由于其测量功…...

QLineEdit限制输入固定字节数(UTF-8编码)

setMaxLength(int)只能用来限制输入的字符个数 QLineEdit *editor new QLineEdit(parent); editor->setMaxLength(32); 1、如果是单字节字符&#xff0c;如数字&#xff0c;字母等&#xff0c;字符数正好等于字节数 2、如果是多字节字符&#xff0c;UTF8编码时&#xff0…...

基于ubuntu的mysql 8.0安装教程

文章目录 1.查看版本2.切换到root账户3.下载安装包4.问题的解决5.查看是否解压成功6.安装我们的发布包7.更新包的内容8.下载mysql9.查看mysql的状态10.设置开机自启动11.登录mysql 公司里面的mysql根本不会出现在windows操作系统上面&#xff0c;下面我们演示的就是如何在ubunt…...

K8s ConfigMap的基础功能介绍

在 Kubernetes 中&#xff0c;ConfigMap 是一种用于管理配置信息的资源对象&#xff0c;它允许你将 配置信息与代码解耦&#xff0c;方便管理和更新应用配置&#xff0c;而无需重新构建镜像或重启服务。 ConfigMap 的功能 存储配置信息&#xff1a; 可以以 键值对 的形式存储配…...

Linux——Shell

if 语句 格式&#xff1a;if list; then list; [ elif list; then list; ] ... [ else list; ] fi 单分支 if 条件表达式; then 命令 fi 示例&#xff1a; #!/bin/bash N10 if [ $N -gt 5 ]; then echo yes fi # bash test.sh yes 双分支 if 条件表达式; then 命令 else 命令…...

armsom产品编译烧录Linux固件

1、开发环境及工具准备 Rockchip Linux 软件包&#xff1a;linux-5.10-gen-rkr4 主机&#xff1a; 安装VMware搭建虚拟机&#xff0c;版本为Ubuntu 20.04 (硬盘容量大于100G&#xff09; 安装远程连接工具MobaXterm&#xff08;可连接虚拟机方便文件传输&#xff09; 2、S…...

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode&#xff1a;Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文&#xff0c;将在Visual Studio Code中&#xff0c;安装和使用Markdown插件&#xff0c;以Marktext插件为例。 1.安装Marktext 打开VSCode&#xff0c;侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…...

AI 行业发展趋势:科技创新引领未来变革

在当今数字化时代,人工智能(AI)行业正以前所未有的速度蓬勃发展,深刻地改变着我们的生活、工作和社会格局。从基础技术的突破到广泛的应用场景拓展,AI 展现出了一系列令人瞩目的发展趋势,预示着一个充满无限可能的未来。 一、技术创新持续突破 模型规模与性能提升 AI 模…...

FB爆款打法实操经验总结

在进行Facebook广告投放时&#xff0c;有效的预算控制、素材测试、广告效果评估和lookalike受众的管理是至关重要的。通过科学的方法和策略&#xff0c;您可以在竞争激烈的市场中实现更好的业绩。 01 预算控制 测试阶段的广告不稳定性&#xff1a;在投放广告的初期&#xff0c…...

微信小程序TTS解决方案

微信小程序原生语音合成 API&#xff08;基础且简单&#xff09; 介绍&#xff1a;微信小程序提供了基础的语音合成能力。通过wx.createInnerAudioContext()等相关API&#xff0c;可以实现简单的语音播放功能。不过它主要是用于音频播放&#xff0c;对于完整的文本到语音&#…...

centos stream 8下载安装遇到的坑

早在2020年12月。CentOS 官方发文宣称&#xff1a;“CentOS项目的未来是 CentOS Stream 明年我们会将重点从CentOS Linux 转移到CentOS Stream 它紧随当前 RHEL 版本之前。CentOS Linux 8 作为 RHEL 8 的重建&#xff0c;将于 2021 年底结束。CentOS Stream 在该日期之后继续&a…...

计算机网络——期末复习(1)背诵

背诵 交换机与路由器&#xff1a;交换机连接同一子网&#xff0c;利用帧中的目的物理地址转发帧&#xff0c;工作在数据链路层&#xff1b;路由器连接不同子网&#xff0c;利用IP数据报中的目的IP地址转发IP数据报&#xff0c;工作在网络层。五层的任务&#xff1a;&#xff0…...

AORO M6 Pro单北斗防爆终端全面国产化,关键技术不再“卡脖子”

全球科技竞争日益激烈&#xff0c;核心技术自主创新已成为国家发展的战略基石。面对关键技术被“卡脖子”的风险&#xff0c;中国科技企业正加速推进信息技术应用创新战略&#xff0c;力求在关键领域实现自主可控。遨游通讯推出的一款融合单北斗、鸿蒙系统、5G国产芯片的防爆终…...

ubuntu 卸载 MySQL

1. 卸载 MySQL 1.1 停止 MySQL 服务 首先&#xff0c;停止 MySQL 服务&#xff1a; sudo systemctl stop mysql 1.2 卸载 MySQL 包 使用 apt-get 命令卸载 MySQL 包&#xff1a; sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* my…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...