【Rust自学】3.5. 控制流:if else
3.5.0. 写在正文之前
欢迎来到Rust自学的第三章,一共有6个小节,分别是:
- 变量与可变性
- 数据类型:标量类型
- 数据类型:复合类型
- 函数和注释
- 控制流:
if else(本文) - 控制流:循环
通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。
喜欢的话记得点赞、收藏加关注哦,想要跟着学下去记得关注专栏哦
3.5.1. if表达式的基本认识
- if表达式允许根据条件来执行不同的代码分支操作
- 这个条件必须是布尔类型。这点不同于Ruby、JS和C++,它们会把if后的非布尔类型转换为布尔类型
- 条件可以是一个字面值、一个表达式或是一个变量
- if表达式中,与条件相关联的代码就叫做分支(在讲
match时就有提到过这个概念) - 可选的,在后面可以加上一个else表达式
fn main(){let machine = 6657;if machine < 11451 {println!("condition is true");} else {println!("condition is false");}
}
这个例子中,machine这个变量的值是小于11451 的,所以程序会执行println!("condition is true");这一行;如果修改machine的值使其不小于114514,那么程序就会执行else后的代码块。
3.5.2. 用else if处理多重条件
如果需要进行多重条件判断又不想在else下不停地写嵌套,那么使用else if就是很好的选项。
fn main(){let number = 6;if number % 4 == 0 {println!("Number is divisible by 4");} else if number % 3 == 0 {println!("Number is divisible by 3");} else if number % 2 == 0 {println!("Number is divisible by 2");} else {println!("Number is nor divisible by 4, 3 or 2");}
}
6既能被3整除也能被2整除,所以else if number % 3 == 0和else if number % 2 == 0都是true,由于if、else if和else是按顺序从上到下判断的所以谁在前面就输出谁。在这个例子中,else if number % 3 == 0在前面,所以程序就会执行println!("Number is divisible by 3");,而else if number % 2 == 0下的代码块就不会被执行。
如果程序中使用了多于一个else if,那么最好使用match来重构代码。
比如上面那段话就可以重构为(非唯一解):
fn main() {let number = 6;match number {n if n % 4 == 0 => println!("Number is divisible by 4"),n if n % 3 == 0 => println!("Number is divisible by 3"),n if n % 2 == 0 => println!("Number is divisible by 2"),_ => println!("Number is not divisible by 4, 3, or 2"),}
}
显而易见,使用match的代码更加直观
3.5.3. 在let语句中使用if
if在Rust中是一个表达式,所以可以将它放在let语句中等号的右边
fn main(){let condition = true;let number = if condition { 5 } else { 6 };println!("The value of number is:{}", number);
}
这个例子中,因为condition是true,所以会把5赋给number,最后的输出结果就是The value of number is:5;如果condition是false,那么就会把else后的值6赋给number。
这种写法于Python非常相像,但是两者有本质上的区别:
-
Rust:
- Rust 中的
if-else是表达式,可以直接返回值。换句话说,if结构本身可以参与到其他表达式的计算中。 - 在 Rust 中,几乎所有代码块都可以是表达式,比如 {} 块也可以返回一个值。
- Rust 中的
-
Python:
- Python 中的
if-else是一个特定的三元运算符形式,专门为单行条件表达式设计。 - Python 的普通
if-else语句是控制流的一部分,它不返回值,不能嵌入到其他表达式中。
- Python 中的
fn main(){let condition = true;let number = if condition { 5 } else { "6" };println!("The value of number is:{}", number);
}
这个例子在编译时会报错:if` and `else` habe incompatible types,就是if和else拥有不兼容的类型。因为Rust是一个静态强类型语言,在编译时就必须知道变量的类型是什么以便这个变量在其他地方使用。在这个例子中,if块下的返回值类型是i32,else块下的返回值是字符串类型,编译器无法在编译时确定变量number的类型到底是i32还是字符串类型,所以会报错。
一句话总结:if-else 表达式的分支必须返回相同类型的值
相关文章:
【Rust自学】3.5. 控制流:if else
3.5.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型数据类型:复合类型函数和注释控制流:if else(本文)控制流:循环 通过第二章…...
美国信息学奥林匹克竞赛USACO 2024年12月比赛铜级问题1. 循环舍入-答案代码
题目见: USACO 2024年12月比赛铜级问题1. 循环舍入(USACO 2024 December Contest, Bronze Problem 1. Roundabount Rounding) 最简单的青铜级 亲测所有得分点通过哈! 下一篇会给解题分析哦! #include <iostream> using namespace std;…...
Llama3模型详解 - Meta最新开源大模型全面解析
📚 Meta最新发布的Llama3模型在开源社区引起广泛关注。本文将全面解析Llama3的技术特点、部署要求和应用场景。 一、模型概述 1. 基本信息 发布机构: Meta AI开源协议: Llama 2 Community License Agreement模型规格: 7B/13B/34B/70B训练数据: 2万亿tokens上下文长…...
2021-02-12 c++里面cin.sync()函数的意思
回复急~救救菜鸡吧,C用cin.clear()和cin.sycn()清空缓存区一直清不了!_编程语言-CSDN问答 标识符号为:goodbit 无错误 Eofbit 已到达文件尾 failbit 非致命的输入/输出错误可挽回 badbit 致命的输入/输出错误无法挽回 int a 0;cin >> a;if (cin.rdstate() i…...
下载红米Note 9 Pro5G对应的LineageOS代码下载及编译
构建 LineageOS 进入网站:Info about gauguin | LineageOS Wiki,点击:Build for yourself,里面有详细的教程,我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为:20.04.6LinagesOS版本:21-…...
《探索 Caffe2 的 C++接口在移动设备上的性能优化之路》
在当今移动应用日益智能化的时代,将深度学习框架如 Caffe2 的 C接口应用于移动设备上已成为众多开发者的目标。然而,移动设备资源相对有限,如何优化其性能成为了关键挑战。 一、移动设备应用深度学习的现状与挑战 随着智能手机等移动设备的…...
1.编写一个程序,给定一个大写字母,要求用小写输出
思路:ascII码值 例如:A的ASCII码值为65,a的ASCII码值为97,不难发现,大小写字母之间的ascii值相差了32 #include <stdio.h> int main() {char c;scanf("%c",&c);printf("%c",c32);retu…...
条件随机场(CRF)详解:原理、算法与实现(深入浅出)
目录 1. 引言2. 什么是条件随机场?2.1 直观理解2.2 形式化定义 3. CRF的核心要素3.1 特征函数3.2 参数学习 4. 实战案例:命名实体识别5. CRF vs HMM6. CRF的优化与改进6.1 特征选择6.2 正则化 7. 总结与展望参考资料 1. 引言 条件随机场(Conditional Ra…...
Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题
文章目录 问题:解决办法:gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题: 你从githb上clone了一个项目,本地跑的时候,各种报错。…...
防抖(Debounce)和节流(Throttle)的区别和应用场景
防抖(Debounce)和节流(Throttle)虽然都是用来限制函数的执行频率,但它们的实现方式和应用场景有所不同。以下是两者的主要区别: 1. 执行原理 防抖(Debounce): 执行条件&a…...
前端 Code Review 常见问题
在前端开发中,代码审查(Code Review)是一个至关重要的步骤。它不仅可以帮助团队成员之间共享知识和经验,还可以提高代码质量,减少错误和安全漏洞。以下是一些常见的前端 Code Review 问题和相应的解决方案。 1. 不一致…...
Python监控AWS ECS集群和服务的CPU和内存利用率
在电子商务或其他行业,重要节日通常会带来大量的流量和订单,这对应用程序的资源利用率提出了更高的要求。为了确保应用程序在节日期间能够顺利运行,提前监控和优化资源利用率至关重要。 在本文中,我们将介绍如何使用Python编写一个脚本,从AWS CloudWatch中获取ECS集群和服务的…...
淘宝天猫API接口深度解析:如何高效利用商品详情与关键词搜索商品列表功能
在电子商务的浩瀚海洋中,淘宝和天猫作为两大巨头,其平台上的商品信息无疑是商家和消费者关注的焦点。为了更高效地获取这些信息,淘宝天猫开放平台提供了丰富的API接口,其中商品详情接口和关键词搜索商品列表接口尤为关键。本文将深…...
python快速接入阿里云百炼大模型
1.注册阿里云账号 访问阿里云官网,完成账号注册流程,并开通百炼服务,网址:https://bailian.console.aliyun.com 2.获取 API Key 登录阿里云百炼平台,在个人中心或相关设置页面找到并生成 API Key,妥善保管此…...
基于AI对话生成剧情AVG游戏
游戏开发这个领域,一直有较高的学习门槛。作为一个非专业的游戏爱好者,如果想要开发游戏,往往受制于游戏引擎的专业程度,难以完成复杂的游戏项目。 AI IDE的诞生,提供了另外的一种思路,即通过AI 生成项目及…...
[flutter] 安卓编译配置
Maven 镜像 android/build.gradle buildscript {ext.kotlin_version 1.7.10repositories {google() // mavenCentral()maven { url https://maven.aliyun.com/repository/google }maven { url https://maven.aliyun.com/repository/jcenter }maven { url https://mav…...
使用ENSP实现NAT(2)
一、NAT的类型 二、静态NAT 1.项目拓扑 2.项目实现 路由器AR1配置: 进入系统视图 sys将路由器命名为AR1 sysname AR1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为192.168.10.254/24 ip address 192.168.10.254 24进…...
解决小程序中ios可以正常滚动,而Android失效问题
解决小程序中 iOS 可以正常滚动,而 Android 失效问题 在开发小程序时,我们经常会遇到一些平台兼容性问题。最近,我在开发一个小程序时遇到了一个问题:在 iOS 设备上可以正常滚动加载更多数据,而在 Android 设备上却无…...
docker安装部署
1.Docker简介 Docker是一个开源的容器引擎,开发者可以打包应用以及相关依赖包到一个可移植的容器中,发布到任何流行的Linux机器上。容器是完全使用沙箱机制,相互之间不会有任何接口,而且更轻量级。 1.1 概念 docker会自动搜索并下载应用镜像,镜像不仅包含应用本身,还包含…...
百度23届秋招研发岗A卷
百度23届秋招研发岗A卷 2024/12/16 1.下面关于 SparkSQL 中 Catalyst 优化器的说法正确的是(ABC) A.Catalyst 优化器利用高级编程语言功能(例如 Scala 的模式匹配)来构建可扩展的查询优化器 B.Catalyst 包含树和操作树的规则集…...
Apache Paimon面试通关秘籍-快照机制深度解析
1. 快照机制:Paimon的时光机原理 第一次接触Paimon的快照功能时,我脑海中浮现的是《哆啦A梦》里的时光机——它能带你回到任意时间点查看数据的历史状态。这个看似简单的功能背后,其实藏着Paimon最核心的设计哲学。 快照本质上就是数据表在某…...
3分钟掌握RegRipper:Windows注册表取证分析的终极武器
3分钟掌握RegRipper:Windows注册表取证分析的终极武器 【免费下载链接】RegRipper3.0 RegRipper3.0 项目地址: https://gitcode.com/gh_mirrors/re/RegRipper3.0 你是否曾面对Windows注册表文件感到无从下手?想知道如何快速提取关键数字证据&…...
AutoGLM沉思版 vs OpenAI DeepResearch:免费国产AI Agent能否替代200美元/月的服务?
AutoGLM沉思版与OpenAI DeepResearch深度对比:企业级AI研究工具如何选择? 当企业研发团队需要处理海量文献综述时,当投资机构需要快速生成行业分析报告时,技术决策者往往面临一个关键选择:是选择国际知名但价格高昂的O…...
AMD Ryzen处理器深度调试指南:解锁硬件性能的终极利器
AMD Ryzen处理器深度调试指南:解锁硬件性能的终极利器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...
高效使用Cursor Free VIP:5步全面解锁AI编程Pro功能终极指南
高效使用Cursor Free VIP:5步全面解锁AI编程Pro功能终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached yo…...
如何用CodeMaker将Java/Scala开发效率提升300%?5个核心技巧带你掌握智能代码生成
如何用CodeMaker将Java/Scala开发效率提升300%?5个核心技巧带你掌握智能代码生成 【免费下载链接】CodeMaker A idea-plugin for Java/Scala, support custom code template. 项目地址: https://gitcode.com/gh_mirrors/co/CodeMaker 作为Java/Scala开发者&a…...
别再让广播闪退!Android 14广播安全新规RECEIVER_EXPORTED的保姆级避坑指南
Android 14广播安全新规:RECEIVER_EXPORTED的深度解析与实战指南 去年秋天,当Google正式发布Android 14时,许多开发者发现原本运行良好的广播注册代码突然开始抛出SecurityException。这个看似简单的API变更背后,其实是Android团队…...
Midscene.js:重塑UI自动化的革命性AI视觉驱动方案
Midscene.js:重塑UI自动化的革命性AI视觉驱动方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否曾为编写复杂的UI自动化脚本而头疼ÿ…...
tao-8k嵌入模型实测:Xinference免配置部署,长文本处理效率翻倍
tao-8k嵌入模型实测:Xinference免配置部署,长文本处理效率翻倍 1. 引言:长文本嵌入的工程挑战 在自然语言处理领域,文本嵌入模型扮演着至关重要的角色。它们将文本转换为高维向量表示,为语义搜索、文档聚类、问答系统…...
MPU9250 I²C驱动库深度解析与嵌入式工程实践
1. MPU9250 IC驱动库技术解析与工程实践指南 MPU9250是InvenSense(现为TDK子公司)推出的高性能9轴运动传感器,集成3轴陀螺仪、3轴加速度计和3轴磁力计,广泛应用于无人机姿态解算、可穿戴设备运动追踪、机器人SLAM前端感知等嵌入式…...
