Rust语言入门第七篇-控制流

文章目录

  • Rust语言入门第七篇-控制流
    • If 表达式
      • 基本结构
      • 特点和规则
      • 示例
    • let 语句中使用 if
    • loop 循环
        • 基本结构
        • 特点
        • 示例
        • 综合示例
    • while 循环
        • 基本结构
        • 特点
        • 示例
        • 综合示例
      • 与 `loop` 循环的区别
    • for 循环
        • 基本结构
        • 详细说明
        • 特点
        • 示例
        • 综合示例

Rust语言入门第七篇-控制流

Rust 的控制流是指程序执行过程中根据不同的条件选择不同的代码路径的能力。这是编程中一个核心的概念,帮助开发者实现逻辑判断、循环执行等基本结构。Rust 语言提供了一些关键的控制流构造,主要包括 if 表达式、match 表达式、loop、while、for 循环等。

If 表达式

if表达式在很多语言中很常见!if表达式允许条件不同执行不同的代码。

Rust 语言中的 if 表达式用于基于条件来执行不同的代码块。它的结构相对直接,但有几个特点需要注意,这些特点体现了 Rust 作为一门类型安全和表达式导向语言的特性。以下是 if 表达式的基本结构和一些关键点:

基本结构

if 条件 {// 当条件为 true 时执行的代码块
} else {// 当条件为 false 时执行的代码块(可选)
}

特点和规则

  1. 条件必须是布尔类型 (bool):与某些其他语言不同,Rust 不会隐式地将非布尔类型的值转换为布尔值。你需要确保 if 后面的条件表达式直接评估为一个布尔值。

  2. 代码块 ({}):即使 ifelse 分支只包含一条语句,你也必须使用花括号 {} 将其包裹起来。这是为了保持一致性,并且因为 Rust 中几乎所有东西都是表达式。

  3. 可选的 else if:为了实现多路分支,你可以链式使用 else if 语句。

if 条件1 {// 当条件1为 true 时执行
} else if 条件2 {// 当条件1为 false 并且条件2为 true 时执行
} else {// 当以上所有条件都为 false 时执行
}
  1. 表达式 vs. 语句:在 Rust 中,if 表达式实际上是一个表达式,这意味着它有返回值。每个分支的最后一项(即最后一个表达式的值)决定了整个 if 表达式的值。这使得 if 表达式可以在需要值的上下文中使用,比如赋值给变量或作为函数的返回值。

示例

fn calculate_result(score: i32) -> &'static str {if score > 90 {"Excellent"} else if score > 75 {"Good"} else {"Keep trying"}
}fn main() {let score = 85;let result = calculate_result(score);println!("{}", result); // 输出 "Good"
}

在这个示例中,calculate_result 函数根据分数返回不同的评价等级,展示了 if 表达式如何用作返回值的计算。

let 语句中使用 if

在 Rust 中,结合 let 和 if 一起使用的结构被称为 if let 表达式。这是一种简化版的 match 表达式,专门用于处理单一的模式匹配情况

fn main() {let condition = true;let number = if condition { 5} else { 6 };println!("数字的值为:{number}");   
}

在这里插入图片描述

这段 Rust 代码演示了如何使用 if 表达式作为值赋给变量,体现了 Rust 中 if 表达式不仅用于控制流,还可以直接产生值的特性。下面是详细的解释:

  1. 初始化变量 condition: 首先,定义了一个布尔型变量 condition 并将其值设为 true

    let condition = true;
    
  2. 使用 if 表达式赋值给 number: 接下来,定义了一个变量 number,其值由一个 if 表达式决定。这个 if 表达式检查 condition 的值:

    • 如果 conditiontrue,则执行 { 5 } 代码块,表达式的值为 5
    • 如果 conditionfalse,则执行 { 6 } 代码块,表达式的值为 6

    这里,if 表达式直接充当了一个值生成器,其结果(56)被赋给了 number

    let number = if condition { 5 } else { 6 };
    

loop 循环

loop 是 Rust 中的一种循环结构,它没有内置的终止条件,因此会一直执行循环体内的代码,直到遇到 break 语句为止。这对于需要无限循环或循环次数未知的情况非常有用。

基本结构
loop {// 循环体内的代码// 使用 break 语句来退出循环
}
特点
  1. 无终止条件loop 没有内置的终止条件,这意味着它会一直运行,直到你显式地使用 break 语句来停止它。
  2. 使用 break 退出:要终止 loop 循环,你必须在循环体内使用 break 语句。
  3. 使用 continue 跳过迭代:你也可以使用 continue 语句来跳过当前迭代,并立即开始下一次迭代。
示例

下面是一个简单的 loop 循环示例,该示例将会数到 10 并打印出每个数字。当计数达到 10 时,使用 break 语句退出循环。

fn main() {let mut count = 0;loop {println!("Count: {}", count);count += 1;if count == 10 {break;}}
}
综合示例

下面是一个稍微复杂的例子,该示例使用 loop 来模拟一个简单的游戏,玩家可以选择继续游戏或退出。

use std::io;fn main() {let mut choice = 'y';loop {println!("Welcome to the game!");println!("Do you want to play? (y/n)");let mut input = String::new();io::stdin().read_line(&mut input).expect("Failed to read line");choice = input.trim().chars().next().unwrap_or('n');if choice == 'y' {println!("Playing...");} else {println!("Exiting...");break;}}
}

在这个示例中:

  • 我们定义了一个变量 choice 来存储用户的输入。
  • 使用 loop 来重复询问用户是否想继续玩游戏。
  • 使用 std::io::stdin().read_line() 来读取用户的输入。
  • 使用 break 语句来结束循环,当用户输入 ‘n’ 时。

这个示例展示了如何使用 loop 来构建一个无限循环,并通过用户输入来控制循环的终止。

while 循环

基本结构
while condition {// 当条件为 true 时执行的代码块
}
特点
  • while 循环会在每次迭代前检查给定的条件。
  • 如果条件为 true,则执行循环体内的代码。
  • 如果条件为 false,则不执行循环体内的代码,并且循环终止。
  • loop 相比,while 循环提供了内置的终止条件,这使得它适合于那些你知道循环应该执行多少次或何时应停止的情况。
  • 在循环体内部,你可以使用 break 语句来提前终止循环。
  • 你也可以使用 continue 语句来跳过当前迭代并开始下一次迭代。
示例

下面是一个简单的 while 循环示例,该示例将会数到 10 并打印出每个数字。

fn main() {let mut count = 0;while count < 10 {println!("Count: {}", count);count += 1;}
}
综合示例

下面是一个稍微复杂的例子,该示例使用 while 循环来模拟一个简单的游戏,玩家可以选择继续游戏或退出。

use std::io;fn main() {let mut choice = 'y';while choice == 'y' {println!("Welcome to the game!");println!("Do you want to play? (y/n)");let mut input = String::new();io::stdin().read_line(&mut input).expect("Failed to read line");choice = input.trim().chars().next().unwrap_or('n');if choice == 'y' {println!("Playing...");} else {println!("Exiting...");}}
}

在这个示例中:

  • 我们定义了一个变量 choice 来存储用户的输入。
  • 使用 while 来重复询问用户是否想继续玩游戏,只要 choice'y'
  • 使用 std::io::stdin().read_line() 来读取用户的输入。
  • 用户可以通过输入 'n' 来退出游戏,此时 choice 变为 'n'while 循环的条件变为 false,循环终止。

loop 循环的区别

  • while 循环在每次迭代之前检查条件是否为 true,而 loop 没有内置的终止条件。
  • while 循环适合于那些你知道循环应该执行多少次或何时应停止的情况,而 loop 更适用于不知道循环次数的情况。
  • while 循环中,如果初始条件就是 false,那么循环体内的代码将不会被执行;而在 loop 循环中,你必须显式地使用 break 语句来终止循环。

for 循环

基本结构
for variable in iterable {// 循环体内的代码
}
详细说明
  • for 关键字:开始 for 循环。
  • variable:循环变量,用于保存每次迭代中的当前元素。这可以是任意有效的 Rust 标识符。
  • in 关键字:表示循环变量将在接下来的迭代中遍历的集合或范围。
  • iterable:可以被迭代的对象,它可以是实现了 IntoIterator 特性的任何类型,例如向量 (Vec<T>), 数组 ([T; N]), 字符串 (String&str), 范围 (a..ba..=b) 等。
  • { ... }:花括号包围的代码块,称为循环体。这里包含了每次迭代要执行的代码。
特点
  • 自动迭代for 循环会自动迭代 iterable 中的每个元素,并在每次迭代时将当前元素绑定到 variable
  • 类型推断:编译器会自动推断 variable 的类型,使其与 iterable 中的元素类型相匹配。
  • 范围迭代:可以使用范围来指定一个数值序列,例如 0..10 代表从 0 到 9 的整数序列。
  • 引用迭代:默认情况下,for 循环迭代的是 iterable 中元素的引用,这意味着原始数据结构不会被修改。如果你想获得元素的所有权,可以使用 .into_iter() 方法。
  • 可变迭代:如果你想在迭代过程中修改元素,可以使用 iter_mut() 方法来获取可变引用。
示例

下面是一个简单的 for 循环示例,该示例将会遍历一个向量并打印出每个元素。

fn main() {let numbers = vec![1, 2, 3, 4, 5];for number in &numbers {  // 迭代向量中的元素引用println!("Number: {}", number);}for number in numbers.into_iter() {  // 迭代向量中的元素所有权println!("Number: {}", number);}// 使用范围迭代for i in 0..10 {println!("i: {}", i);}
}
综合示例

下面是一个稍微复杂的例子,该示例使用 for 循环来遍历一个字符串,并统计其中每个字符出现的次数。

use std::collections::HashMap;fn main() {let text = "hello world";let mut char_counts = HashMap::new();for c in text.chars() {  // 遍历字符串中的字符let count = char_counts.entry(c).or_insert(0);*count += 1;}for (char, count) in &char_counts {  // 遍历 HashMap 中的键值对println!("'{}': {}", char, count);}
}

在这个示例中:

  • 我们定义了一个字符串 text
  • 使用 for 循环来遍历字符串中的每个字符。
  • 使用 HashMap 来记录每个字符出现的次数。
  • 使用 entry 方法来获取或创建一个条目,然后增加计数。
  • 最后再次使用 for 循环来遍历 HashMap 并打印每个字符及其对应的计数。

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

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

相关文章

Oracle Database 23.5 - for Engineered Systems版本发布

要尝鲜的可以在https://edelivery.oracle.com/下载。对于x86的本地版本再等等吧。 安装可参考飞总的&#xff1a;oracle 23ai&#xff08;23.5.0.24.07&#xff09;完整功能版安装体验 – 提供7*24专业数据库(Oracle,SQL Server,MySQL,PostgreSQL等)恢复和技术支持Tel:1781323…

Python数值计算(12)

本篇说说Neville方法。Neville方法的基础是&#xff0c;插值多项式可以递归的生成&#xff0c;有时进行插值的目的是为了计算某个点的值&#xff0c;这个时候并不需要将拟合曲线完全求出&#xff0c;而是可以通过递归的方式进行计算&#xff0c;具体操作如下&#xff1a; 例如…

OpenGL学习 1

一些唠叨&#xff1a; 很多时候&#xff0c;都被Live2d吸引&#xff0c;去年想给网页加个live2d看板娘&#xff0c;结果看不懂live2d官方给的SDK&#xff0c;放弃了。今天又想弄个live2d桌宠&#xff0c;都已经在网上找到Python 的 Live2D 拓展库了&#xff0c;并提供了用QT实现…

昇思25天学习打卡营第19天|ResNet50 图像分类案例:数据集、训练与预测可视化

目录 环境配置 数据集加载 数据集可视化 Building Block Bottleneck 构建ResNet50网络 模型训练与评估 可视化模型预测 环境配置 首先指出实验环境预装的 mindspore 版本以及更换版本的方法。然后&#xff0c;它卸载了已安装的 mindspore 并重新安装指定的 2.3.0rc1 版本…

值得买科技与MiniMax达成官方合作伙伴关系,共建融合生态

7月29日&#xff0c;值得买科技与大模型公司MiniMax宣布达成官方合作伙伴关系。 MiniMax旗下大模型产品海螺AI现已接入值得买“消费大模型增强工具集”&#xff0c;基于海螺AI比价策略&#xff0c;用户可通过海螺AI“悬浮球”功能实现快速比价及跳转购买。 此次合作也标志着值…

操作系统重点总结

文章目录 1. 操作系统重点总结1.1 操作系统简介1.1.1 操作系统的概念和功能1.1.2 操作系统的特征1.1.2.1 并发1.1.2.2 共享1.1.2.3 虚拟1.1.2.4 异步 1.1.3 操作系统的发展与分类1.1.4 中断和异常1.1.5 系统调用1.1.6 操作系统的体系结构1.1.7 操作系统简介总结 1.2 进程1.2.1 …

使用YApi平台来管理接口

快速上手 进入YApi官网&#xff0c;进行注册登录https://yapi.pro/添加项目 3. 添加分类 4. 添加接口 5. 添加参数 添加返回数据 可以添加期望 验证 YAPI&#xff08;Yet Another Practice Interface&#xff09;是一个现代化的接口管理平台&#xff0c;由淘宝团队…

企业邮箱如何进行邮件监控

企业邮箱监控保障资产安全、合规性&#xff0c;防范网络攻击&#xff0c;提升员工行为。核心要素包括内容扫描、行为分析、合规性检查等。实施策略涉及技术选择、政策制定、员工培训。企业邮箱如何进行邮件监控呢&#xff1f;Zoho邮箱的eDiscovery功能可实现长期邮件保存和监控…

基于百度paddle检索系统的召回

所谓召回&#xff0c;无非就是用一段不规则文本模拟用户query查询&#xff0c;而要召回的是标准的titlekey,这些是要构建索引库的&#xff0c;所有相似文本对的第二个文本必须要在索引库里存在&#xff0c;不然就没法评估,因为标记都是0,还有召回1&#xff0c;召回5等,并不是什…

在Ubuntu 22 VPS服务器上更改phpMyadmin端口的方法

更改 Ubuntu 22 VPS服务器上的 phpMyAdmin 端口可以增强安全性和可管理性。但是具体应该怎么操作呢&#xff1f;接下来将带您了解在Ubuntu 22 VPS 服务器上更改phpMyadmin的端口全过程&#xff0c;一起来看看吧。 准备你的环境 在开始之前&#xff0c;让我们先确保你已做好一…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么&#xff0c;有没有重复加载&#xff1f;此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件&#xff0c;某某Beautify等等。但这些插件看人品&#xff0c;运气不好搞的话&#xff0c;反…

实验2-3-8 计算火车运行时间

//实验2-3-8 计算火车运行时间 /* 输入格式&#xff1a;输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。 每个时间的格式为2位小时数&#xff08;00-23&#xff09;和2位分钟数&#xff08;00-59&#xff09;&#xff…

dockerfile部署镜像 ->push仓库 ->虚拟机安装建木 ->自动部署化 (详细步骤)

目录 创建私服仓库 vi /etc/docker/daemon.json vim deploy.sh判断脚本内容 创建 建木 后端部署 命名空间 设置密码用户名 创建git仓库 gitignore文件内容 图形项目操作 git maven docker镜像 点击流程日志 vim /etc/docker/daemon.json 执行部署脚本 ip 开发…

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科…

Spring 高级解析 07

文章目录 1. Spring 概述&#xff08;基本情况&#xff09;1.1 Spring 的优势1.2 Spring 的核⼼结构 2. 核⼼思想 IoC 和 AOP2.1 什么是IoC&#xff1f;2.2 什么是AOP2.3 AOP在解决什么问题 3. Spring IoC ⾼级应⽤3.1 BeanFactory与ApplicationContext区别3.1.1 BeanFactory3.…

Android虚假定位的实现与防护

Android中常用的定位方式 一&#xff0c;GPS定位 定义&#xff1a;全球卫星定位系统&#xff0c;直接和卫星交互&#xff0c;获取设备经纬度 优点&#xff1a; 走卫星通信通道&#xff0c;无需打开Wifi或流量就能获得位置信息 精确度最高&#xff0c;几米到几十米 缺点&a…

Java面试八股之Spring AOP 和 AspectJ AOP 的区别

Spring AOP 和 AspectJ AOP 的区别 Spring AOP 和 AspectJ AOP 是两种不同的面向切面编程&#xff08;Aspect-Oriented Programming, AOP&#xff09;实现。它们各有特点&#xff0c;适用于不同的场景。下面是一些主要的区别&#xff1a; 1. 实现机制 Spring AOP: 基于代理…

为Mac配置Alfred

参考资料&#xff1a; Alfred神器使用手册 | louis blogMacOS神器之Alfred workflow概览GitHub - arpir/Alfred-Workflows-Collection: 一些好用的 Alfred Workflow 一、修改快捷键 Spotlight的默认快捷键是Command Space Alfred的默认快捷键是Option Space 可以将Alfred和…

Alternating Sum

Problem - 963A - Codeforces 处理式子 显然中间式子是等比数列 // Problem: A. Alternating Sum // Contest: Codeforces - Tinkoff Internship Warmup Round 2018 and Codeforces Round 475 (Div. 1) // URL: https://codeforces.com/problemset/problem/963/A // Memory Lim…

awk用法

文章目录 一、awk工具awk工作原理AWK程序的结构awk内置变量 二、案例1.基础案列2.BEGIN END 运算3.数值与字符串的比较4.awk高级用法5. awk if语句6.BEGIN END 流程7.AWK 数组8.awk 循环 一、awk工具 awk工作原理 当读到第一行时&#xff0c;匹配条件&#xff0c;然后执行指定…