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

学习笔记五——Rust 控制流全解析

📚 目录

  1. 什么是控制流?Rust 有什么特别?
  2. if 表达式完整语法
  3. loop / while / for 三种循环写法
  4. match 表达式 + _ 通配符深入解释
  5. if let 表达式用法与场景
  6. Option、Some、None 全面通俗讲解
    • "Tom""Tom".to_string() 有啥本质区别?
    • 什么叫“你需要完整拥有这个字符串”?
  7. 总结:从语法到思想的控制流精通路线

1️⃣ 什么是控制流?Rust 又有什么不同?

控制流就是**程序根据情况“怎么走”**的能力。

在 Rust 中,控制流不只是控制路径,更是表达式,也就是说,大部分结构都能返回值,不是单纯“执行一下就完了”。


2️⃣ if 表达式语法(可以返回值!)

let score = 75;let result = if score >= 60 {"及格"
} else {"不及格"
};println!("成绩是:{}", result);

✅ Rust 中 if 是表达式,意思是它有返回值,能被赋值。

注意ifelse 返回的值必须是相同类型!


3️⃣ 循环语法:loop / while / for

🔁 loop(死循环 + 可返回值)

let mut count = 0;let result = loop {count += 1;if count == 3 {break count * 2;}
};
println!("结果:{}", result); // 输出:6

🔁 while(条件成立就循环)

let mut n = 3;while n > 0 {println!("倒数:{}", n);n -= 1;
}

🔁 for(遍历范围或集合)

for i in 1..4 {println!("{}", i); // 输出 1, 2, 3(不含4)
}let names = vec!["Tom", "Amy"];
for name in names {println!("你好,{}", name);
}

4️⃣ match 表达式 + _ 通配符的真正含义

基本用法

let score = 45;let level = match score {90..=100 => "优秀",60..=89 => "及格",_ => "不及格",  // 通配符:兜底处理
};println!("成绩等级:{}", level);

_ 是什么?

  • _ 是一个“通配符”,意思是:“不管其他是什么,统统算进来”;
  • 它在 match 中的作用相当于 JavaScript 的 default、Python 的 else 分支;
  • Rust 的 match 要求你必须穷举所有可能的分支,所以 _ 是一个通用的“兜底方案”。

_ 的本质含义是:“我不关心这个值具体是多少,你只管来了就处理成这样。”

示例:也可以只打印

match day {1 => println!("星期一"),2 => println!("星期二"),_ => println!("其他天"),  // 不管你是3、4、99、9999,全算“其他”
}

5️⃣ if let:只匹配一种情况的快捷方式

原始 match 写法

let name = Some("Tom".to_string());match name {Some(n) => println!("名字是:{}", n),None => println!("没有名字"),
}

if let 简写版本

if let Some(n) = name {println!("名字是:{}", n);
} else {println!("没有名字");
}

✅ 适合只关注 Some(x) 一种情况的时候,更加清爽!


6️⃣ Option / Some / None 的原理与通俗解释

❓ 为什么需要 Option

在 C/Java 中,很多人因为空指针(null)访问导致崩溃。Rust 不允许出现“空值”,而是用 Option<T> 来明确告诉你:这个值可能有,可能没有

let name: Option<String> = Some("Tom".to_string());
let nickname: Option<String> = None;

✅ Option 是啥?

enum Option<T> {Some(T), // 有值None     // 没值
}

你必须显式处理这两种情况,编译器才放行。这就是 Rust 保证“安全”的核心手段!


❗ 为什么 Some("Tom") 报错?

看起来没毛病吧?

let name: Option<String> = Some("Tom"); // ❌ 报错

我们拆开来看:

写法类型属于谁
"Tom"&str静态字符串切片(不可变引用
"Tom".to_string()String有所有权、堆上分配
String::from("Tom")String等价于上面

🧠 什么是“你需要完整拥有这个字符串”?

当你声明:

let name: Option<String>

你就等于说:“我要拥有一个可变的堆上字符串,我可能有,也可能没有。”

Rust 的 String 是:

  • 存在堆上的数据(可以动态增长)
  • 有“所有权”:谁负责创建,就负责释放
  • 可变的

但是 "Tom" 是:

  • 固定存在程序里的静态只读文本
  • 类型是 &str,只是“借来读一下”
  • 你不能修改它、不能拿来做主

所以,Option<String> 不能让你装一个“借来的只读文字进去”,因为它要能负责到底(也就是拥有它)!


✅ 正确写法(获得堆上的可变拥有字符串):

let name = Some("Tom".to_string());
let name2 = Some(String::from("Tom"));

📦 比喻理解:“借书” VS “买书”

  • &str:你去图书馆借一本书看(你不能撕、不能写、不能带回家)
  • String:你自己买了一本书(你可以改写,放哪都行)

当你说 Option<String>,就像你要一个“书架(Option)”去“收纳(拥有)”一本书(String),你当然不能用“借来的图书馆书”放进去!


✅ 最后总结

概念通俗解释是否有所有权
if 表达式判断并返回值✅ 是表达式
loop / while / for循环多种方式✅ 都是表达式
match多分支匹配工具✅ 必须穷尽或 _
_ 通配符兜底匹配所有其他情况✅ 通用,必须覆盖全部
if let只匹配一种情况的简写✅ 比 match 更简洁
Option<T>表示“值可能不存在”✅ 替代 null
Some(x)有值的情况✅ x 必须符合类型
None没值的情况✅ 代表空值
"abc" (&str)借来的不可变引用❌ 无所有权
"abc".to_string() / String::from("abc")堆上有所有权的可变字符串✅ 有所有权

🎁 Bonus:一句话记住核心概念

“如果你要拥有,就别拿别人的,Rust 会让你自己造一份!”

这就是 Rust 的哲学:安全、清晰、必须负责任。

相关文章:

学习笔记五——Rust 控制流全解析

&#x1f4da; 目录 什么是控制流&#xff1f;Rust 有什么特别&#xff1f;if 表达式完整语法loop / while / for 三种循环写法match 表达式 _ 通配符深入解释if let 表达式用法与场景Option、Some、None 全面通俗讲解 "Tom" 和 "Tom".to_string() 有啥本…...

我的Hexo自动Webhook部署方案

前言 最近我也是重新开始管理我的博客网站了&#xff0c;之前大概有了半年的时间没有写文章了。也是经过这半年的学习&#xff0c;我了解的知识更多&#xff0c;更广了。 当我开始写 Hexo 博客的时候&#xff0c;首先我得把 Markdown 文件内容拷贝到服务器上&#xff0c;然后写…...

智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南

本文面向医院信息化团队技术负责人及医疗IoT解决方案开发者&#xff0c;聚焦解决大规模院区导航系统的扩展性、多源数据融合及实时路径规划等技术难点&#xff0c;提供从架构到落地的完整技术路线图。 如需获取智慧医院导航导诊系统解决方案请前往文章最下方获取&#xff0c;如…...

Docker:安装与部署 Nacos 的技术指南

1、简述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务治理的综合解决方案,适用于微服务架构。 Nacos 主要功能: 服务发现与注册:支持 Dubbo、Spring Cloud 等主流微服务框架的服务发现与注册。动态配置管理:支持…...

【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论

1. 背景 之前我们在《生成式模型与判别式模型对比(涉及VAE、CRF的数学原理详述)》以及《生成式模型算法原理深入浅出&#xff08;涉及Stable Diffusion、生成对抗网络、高斯混合模型、隐马尔可夫模型、朴素贝叶斯等算法原理分析及生成式模型解释&#xff09;》中&#xff0c;我…...

tailwindcss 4 使用的一些注意点

目录 一、tailwindcss 4 官网地址变更了 二、自定义颜色的使用方式 三、安装的时候可能的报错 一、tailwindcss 4 官网地址变更了 之前的官网地址是&#xff1a;Tailwind CSS 中文网 现在的官网地址是&#xff1a;Tailwind CSS - Rapidly build modern websites without e…...

案例分析:东华新径,拉动式生产的智造之路

目录 文章目录 目录南京东华智能转向系统有限公司是一家什么公司&#xff1f;背景知识&#xff1a;新能源汽车生产制造流程简介东华遇见了什么问题&#xff1f;东华希望如何解决&#xff1f;解决思路&#xff1a;从 “推动式生产” 到 “拉动式生产”&#xff0c;从 “冗余式思…...

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…...

无锡东亭无人机培训机构电话

无锡东亭无人机培训机构电话&#xff0c;随着科技的迅猛发展&#xff0c;无人机逐渐走入我们的生活和工作领域&#xff0c;成为多种行业中不可或缺的工具。而在其广泛的应用中&#xff0c;如何正确、熟练地操控无人机成为了关键。因此&#xff0c;找到一家专业的无人机培训机构…...

Linux操作系统的计算机体系结构与网络安全的深度关联

在当今数字化时代&#xff0c;Linux操作系统因其开源、稳定和安全性而被广泛应用于服务器、嵌入式系统和云计算等领域。本文将深入探讨Linux的计算机体系结构&#xff0c;并分析其在网络安全中的关键作用。 一、Linux的计算机体系结构 &#xff08;一&#xff09;基于冯诺依曼…...

大厂文章阅读

1.异步任务处理系统&#xff0c;如何解决业务长耗时、高并发难题&#xff1f; 1)任务失败如何处理(CAS失败也可用)&#xff1a;1.指数退避,匹配下游任务执行系统的处理能力。比如收到下游任务执行系统的流控错误&#xff0c;或者感知到任务执行成为瓶颈&#xff0c;需要指数退…...

卷积神经网络 CNN 系列总结(二)---数据预处理、激活函数、梯度、损失函数、优化方法等

数据预处理 零中心化、归一化 关于数据预处理我们有3个常用的符号,数据矩阵X,假设其尺寸是[N x D](N是数据样本的数量,D是数据的维度)。 均值减法(Mean subtraction)是预处理最常用的形式。它对数据中每个独立特征减去平均值,从几何上可以理解为在每个维度上都将数据…...

速学Android 16新功能:带有进度的通知类型

前言 在当前已公布的Android 16版本中新增了一系列的功能特性和API&#xff0c;如&#xff1a; 动态壁纸的内容处理&#xff0c;提供新的 content API 预测性返回更新&#xff0c;添加了finishAndRemoveTaskCallback() 和 moveTaskToBackCallback等API 健康数据共享更新&…...

微信小程序开发:微信小程序上线发布与后续维护

微信小程序上线发布与后续维护研究 摘要 微信小程序作为移动互联网的重要组成部分,其上线发布与后续维护是确保其稳定运行和持续优化的关键环节。本文从研究学者的角度出发,详细探讨了微信小程序的上线发布流程、后续维护策略以及数据分析与用户反馈处理的方法。通过结合实…...

深度学习基础--CNN经典网络之分组卷积与ResNext网络实验探究(pytorch复现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 ResNext是分组卷积的开始之作&#xff0c;这里本文将学习ResNext网络&#xff1b;本文复现了ResNext50神经网络&#xff0c;并用其进行了猴痘病分类实验…...

AutoGen深度解析:从核心架构到多智能体协作的完整指南

AutoGen是微软推出的一个革命性多智能体(Multi-Agent)框架&#xff0c;它通过模块化设计和灵活的对话机制&#xff0c;极大地简化了基于大型语言模型(LLM)的智能体系统开发。本文将深入剖析AutoGen的两个核心模块——core基础架构和agentchat多智能体对话系统&#xff0c;带您全…...

面向对象的需求分析与UML构造块详解

目录 前言1 面向对象的需求分析概述2 UML构造块概述3 UML事物详解3.1 结构事物&#xff08;Structural Things&#xff09;3.2 行为事物&#xff08;Behavioral Things&#xff09;3.3 分组事物&#xff08;Grouping Things&#xff09;3.4 解释事物&#xff08;Annotational T…...

计算机视觉色彩空间全解析:RGB、HSV与Lab的实战对比

计算机视觉色彩空间全解析&#xff1a;RGB、HSV与Lab的实战对比 一、前言二、RGB 色彩空间​2.1 RGB 色彩空间原理​2.1.1 基本概念​2.1.2 颜色混合机制​ 2.2 RGB 在计算机视觉中的应用​2.2.1 图像读取与显示​2.2.2 颜色识别​2.2.3 RGB 色彩空间的局限性​ 三、HSV 色彩空…...

使用Docker安装Gogs

1、拉取镜像 docker pull gogs/gogs 2、运行容器 # 创建/var/gogs目录 mkdir -p /var/gogs# 运行容器 # -d&#xff0c;后台运行 # -p&#xff0c;端口映射&#xff1a;(宿主机端口:容器端口)->(10022:22)和(10880:3000) # -v&#xff0c;数据卷映射&#xff1a;(宿主机目…...

【Web API系列】XMLHttpRequest API和Fetch API深入理解与应用指南

前言 在现代Web开发中&#xff0c;客户端与服务器之间的异步通信是构建动态应用的核心能力。无论是传统的AJAX技术&#xff08;基于XMLHttpRequest&#xff09;还是现代的Fetch API&#xff0c;它们都为实现这一目标提供了关键支持。本文将从底层原理、核心功能、代码实践到实…...

Spring Boot 自定义 Redis Starter 开发指南(附动态 TTL 实现)

一、功能概述 本 Starter 基于 Spring Boot 2.7 实现以下核心能力&#xff1a; Redis 增强&#xff1a;标准化 RedisTemplate 配置&#xff08;JSON 序列化 LocalDateTime 支持&#xff09;缓存扩展&#xff1a;支持 Cacheable(value “key#60s”) 语法动态设置 TTL配置集中…...

ESP32开发入门:基于VSCode+PlatformIO环境搭建指南

前言 ESP32作为一款功能强大的物联网开发芯片&#xff0c;结合PlatformIO这一现代化嵌入式开发平台&#xff0c;可以大幅提升开发效率。本文将详细介绍如何在VSCode中搭建ESP32开发环境&#xff0c;并分享实用开发技巧。 一、环境安装&#xff08;Windows/macOS/Linux&#xf…...

2025.4.13机器学习笔记:文献阅读

2025.4.13周报 题目信息摘要创新点网络架构实验结论不足以及展望 题目信息 题目&#xff1a; Physics-informed neural networks for inversion of river flow and geometry with shallow water model期刊&#xff1a; Physics of Fluids作者&#xff1a; Y. Ohara; D. Moteki…...

Quartz修仙指南:从定时任务萌新到调度大能的终极奥义

各位被Thread.sleep()和ScheduledExecutorService折磨的道友们&#xff01;今天要解锁的是Java界任务调度至尊法宝——Quartz&#xff01;这货能让你像玉皇大帝安排天庭日程一样&#xff0c;精确控制每个任务的执行时机&#xff01;准备好告别蹩脚的手动定时器了吗&#xff1f;…...

如何免费使用Meta Llama 4?

周六, Meta发布了全新开源的Llama 4系列模型。 架构介绍查看上篇文章。 作为开源模型,Llama 4存在一个重大限制——庞大的体积。该系列最小的Llama 4 Scout模型就拥有1090亿参数,如此庞大的规模根本无法在本地系统运行。 不过别担心!即使你没有GPU,我们也找到了通过网页…...

编程助手fitten code使用说明(超详细)(vscode)

这两年 AI 发展迅猛&#xff0c;作为开发人员&#xff0c;我们总是追求更快、更高效的工作方式&#xff0c;AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手&#xff0c;给我们提供了实时的建议和解决方&#xff0c;无论是快速修复错误、提升代…...

Python自动化爬虫:Scrapy+APScheduler定时任务

在数据采集领域&#xff0c;定时爬取网页数据是一项常见需求。例如&#xff0c;新闻网站每日更新、电商价格监控、社交媒体舆情分析等场景&#xff0c;都需要定时执行爬虫任务。Python的Scrapy框架是强大的爬虫工具&#xff0c;而APScheduler则提供了灵活的任务调度功能。 一、…...

技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案

iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片&#xff0c;采用8nmLP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHz。是一款可用于互联网设备和其它数字多媒体的高性能产品。 在…...

Java中的参数是值传递还是引用传递?

在java中&#xff0c; 参数传递只有值传递 ,不论是基本类型还是引用类型。 其中的区别在于&#xff1a; 基本数据类型&#xff08;如byte&#xff0c;short&#xff0c;int等&#xff09;&#xff1a;传递的参数是值的副本&#xff0c;即基本类型的数值本身。因此在方法中&am…...

3.3.1 spdlog异步日志

文章目录 3.3.1 spdlog异步日志1. spdlog1. 日志作用2 .同步日志和异步日志区别 2. spdlog是什么下载命令&#xff1a;2. spdlog为什么高效3. spdlog特征5. spdlog输出控制6. 处理流程7. 文件io8.问题 2. 如何创建logger3. 如何创建sink4. 如何自定义格式化5. 如何创建异步日志…...