Rust 流程控制学习教程

Rust 作为一门注重安全与效率的语言,提供了与其他主流语言相似但又有细节差异的流程控制语法,主要包括分支控制(if-else)和循环控制(loop、while、for)。本教程将基于 Rust 语言圣经(course.rs) 的内容,带您系统掌握 Rust 流程控制的核心用法。

一、分支控制:根据条件“选择道路”

分支控制的核心是“根据条件判断,执行不同代码块”,Rust 中最常用的分支结构是if-else,且不支持switch(需用match替代,后续进阶内容)。

1.1 基础if-else:满足条件就执行

if后面必须跟一个布尔值bool),不能像 C/C++ 那样隐式转换(如数字 0 代表 false),这是 Rust 类型安全的体现。

语法格式
if条件表达式(结果为bool{// 条件为 true 时执行的代码块}elseif另一个条件表达式(结果为bool{// 上一个条件为 false,当前条件为 true 时执行}else{// 所有条件都为 false 时执行(可选)}
示例:判断数字大小
fnmain(){letscore=85;ifscore>=90{println!("成绩优秀");}elseifscore>=70{println!("成绩良好");}elseifscore>=60{println!("成绩及格");}else{println!("成绩不及格");}}// 输出:成绩良好
关键注意点
  • 条件必须是 bool 类型:若写if score { ... }会编译报错,因为scorei32类型,无法直接作为条件。
  • 代码块必须用大括号:即使代码块只有一行,也不能省略{}(如if true println!("ok")是错误的),这是 Rust 强制的代码风格,避免歧义。

1.2if作为表达式:返回值的“条件运算”

在 Rust 中,if-else不仅是语句,还可以作为表达式(能返回一个值),类似其他语言的“三元运算符”(Rust 没有a ? b : c语法,用if-else替代)。

语法规则
  • 所有分支的返回值类型必须一致(否则编译器无法推断最终类型)。
  • 表达式的返回值不需要return,最后一行代码的结果就是返回值(若最后一行加了;,则返回()空类型)。
示例 1:获取两个数的最大值
fnmain(){leta=10;letb=20;// if-else 作为表达式,返回最大值并赋值给 maxletmax=ifa>b{a}else{b};println!("最大值是:{}",max);// 输出:最大值是:20}
示例 2:错误示范(返回类型不一致)
fnmain(){letflag=true;// 错误:一个分支返回 i32,另一个返回 &str,类型不匹配letresult=ifflag{100}else{"hello"};}

二、循环控制:重复执行的“循环赛道”

循环用于让一段代码重复执行,Rust 提供三种循环结构:loop(无限循环)、while(条件循环)、for(遍历循环),覆盖不同场景的重复需求。

2.1loop:无限循环,手动“刹车”

loop是最简单的循环,会无限重复执行代码块,必须通过break手动终止(否则程序会一直运行),适合“不确定循环次数,满足条件就退出”的场景。

基础用法:用break终止循环
fnmain(){letmutcount=0;loop{count+=1;println!("当前计数:{}",count);// 条件满足时终止循环ifcount==3{break;// 退出 loop 循环}}// 输出:// 当前计数:1// 当前计数:2// 当前计数:3}
进阶用法:loop作为表达式返回值

loop也可以作为表达式,在break后跟上要返回的值(所有break的返回值类型需一致),适合“循环中计算结果,退出时返回”的场景。

fnmain(){letmutsum=0;letmutnum=1;// loop 表达式返回最终的 sum 值letresult=loop{sum+=num;num+=1;ifnum>5{breaksum;// 退出循环,返回 sum(此时 sum = 1+2+3+4+5 = 15)}};println!("1到5的和是:{}",result);// 输出:1到5的和是:15}

2.2while:条件满足才循环

while循环会先判断条件表达式(结果为bool),若为true则执行代码块,否则退出循环,适合“已知循环终止条件,不确定循环次数”的场景。

语法格式
while条件表达式(结果为bool{// 条件为 true 时执行的代码块}
示例:遍历数组(不推荐,用 for 更优)
fnmain(){letarr=[10,20,30,40];letmutindex=0;whileindex<arr.len(){println!("数组元素:{}",arr[index]);index+=1;// 手动更新索引,避免死循环}// 输出:// 数组元素:10// 数组元素:20// 数组元素:30// 数组元素:40}
注意点:避免死循环

while true等价于loop,也需要用break终止,例如:

fnmain(){letmutcount=0;whiletrue{count+=1;ifcount==2{break;}}}

2.3for:遍历集合的“最优解”

for循环是 Rust 中最常用的循环,主要用于遍历迭代器(Iterator)或集合(如数组、VecHashMap等),无需手动管理索引,安全且简洁(避免索引越界问题)。

核心语法:for 变量 in 迭代器/集合 { ... }

Rust 中,所有“可遍历”的类型都实现了IntoIteratortrait,for循环会自动将集合转换为迭代器,依次取出元素。

示例 1:遍历数组(推荐用法)

直接遍历数组的元素(无需索引),默认是不可变引用(不转移所有权),若要获取所有权,需用into_iter();若要可变引用,需用iter_mut()

fnmain(){letarr=[1,2,3,4];// 1. 不可变引用(默认,不转移所有权,arr 后续可继续使用)println!("不可变遍历:");foreleminarr.iter(){println!("{}",elem);// elem 是 &i32 类型,自动解引用打印}// 2. 转移所有权(arr 后续不可使用)println!("转移所有权遍历:");letarr2=[1,2,3];foreleminarr2.into_iter(){println!("{}",elem);// elem 是 i32 类型}// 3. 可变引用(修改数组元素)println!("可变遍历(修改元素):");letmutarr3=[1,2,3];foreleminarr3.iter_mut(){*elem+=10;// 用 * 解引用,修改原元素}println!("修改后数组:{:?}",arr3);// 输出:[11, 12, 13]}
示例 2:遍历范围(Range类型)

Rust 提供a..b(左闭右开,包含 a 不包含 b)和a..=b(闭区间,包含 a 和 b)两种范围语法,常用于固定次数的循环。

fnmain(){// 1. 左闭右开:遍历 1,2,3,4(不包含 5)println!("左闭右开范围:");fornumin1..5{println!("{}",num);}// 2. 闭区间:遍历 10,11,12(包含 12)println!("闭区间范围:");fornumin10..=12{println!("{}",num);}}
示例 3:遍历Vec集合
fnmain(){letfruits=vec!["苹果","香蕉","橙子"];// 遍历 Vec 的不可变引用forfruitinfruits.iter(){println!("水果:{}",fruit);}// 遍历后 fruits 仍可使用(因为是引用)println!("集合长度:{}",fruits.len());// 输出:3}

2.4 循环控制:breakcontinue

breakcontinue是循环中的“控制开关”,用于灵活调整循环执行:

  • break:立即终止当前所在的循环(跳出循环体)。
  • continue:跳过当前循环的剩余代码,直接进入下一次循环。
示例:结合breakcontinue
fnmain(){letmutnum=0;loop{num+=1;// 1. 跳过偶数(不执行后续打印)ifnum%2==0{continue;}println!("当前奇数:{}",num);// 2. 当数字大于 10 时终止循环ifnum>10{break;}}// 输出:// 当前奇数:1// 当前奇数:3// 当前奇数:5// 当前奇数:7// 当前奇数:9// 当前奇数:11}

三、实战练习:巩固流程控制用法

通过一个简单的“猜数字游戏”,综合运用if-elseloopbreak等知识,加深对流程控制的理解。

游戏规则

  1. 程序随机生成一个 1-100 之间的整数。
  2. 用户输入一个数字,程序判断“大了”“小了”或“猜对了”。
  3. 猜对后退出循环,游戏结束。

完整代码

usestd::io;userand::Rng;// 需要在 Cargo.toml 中添加 rand 依赖fnmain(){println!("欢迎来到猜数字游戏!");println!("我已经生成了一个 1-100 之间的数字,快来猜一猜吧~");// 1. 生成 1-100 之间的随机数letsecret_num=rand::thread_rng().gen_range(1..=100);// 2. 无限循环,直到猜对loop{println!("\n请输入你猜的数字:");letmutguess=String::new();// 3. 读取用户输入io::stdin().read_line(&mutguess).expect("无法读取输入");// 4. 将输入的字符串转换为整数(处理无效输入)letguess:u32=matchguess.trim().parse(){Ok(num)=>num,Err(_)=>{println!("请输入有效的数字!");continue;// 无效输入,跳过后续判断,重新循环}};// 5. 用 if-else 判断大小ifguess<secret_num{println!("你猜的数字太小了!");}elseifguess>secret_num{println!("你猜的数字太大了!");}else{println!("恭喜你,猜对了!答案就是 {}",secret_num);break;// 猜对了,终止循环}}}

代码说明

  • 随机数生成:依赖rand库(需在Cargo.toml中添加rand = "0.8"),gen_range(1..=100)生成 1-100 的闭区间随机数。
  • 输入处理read_line读取用户输入,parse转换为整数,若转换失败(如输入字母),用match捕获错误并提示,再用continue重新循环。
  • 循环终止:猜对时用break退出loop,游戏结束。

四、总结:流程控制的核心要点

  1. 分支控制if-else是唯一的分支结构,条件必须是bool类型,且支持作为表达式返回值(替代三元运算符)。
  2. 循环控制
    • loop:无限循环,需用break终止,支持返回值。
    • while:条件循环,适合“已知终止条件,未知次数”。
    • for:遍历循环,优先用于集合/迭代器,安全简洁(避免索引越界)。
  3. 控制开关break终止循环,continue跳过当前轮次。

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

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

相关文章

生产级Agentic AI系统构建指南:从demo到稳定上线的实战经验

文章解析了生产级Agentic AI系统的构建要点&#xff0c;强调与demo系统的区别在于稳定性、容错性和可运维性。介绍了环境配置隔离、LLM调用容错机制、配置解耦、结构化日志等关键实践。指出生产级AI系统不是简单堆模型调参&#xff0c;而是把工程细节做到位&#xff0c;这些细节…

AI大模型落地实践:十大行业真实案例,助程序员快速掌握AI应用技能

文章介绍昆仑联通十大AI落地实践案例&#xff0c;涵盖翻译、审核、合同、标书、视频生产等多场景应用&#xff0c;展示AI如何提升企业效率、降低成本&#xff0c;实现从"使用AI工具"到"AI驱动业务"的转型。昆仑联通提供全周期一站式服务&#xff0c;包括前…

2026年专业的精密零部件加工,精密五金机械加工,精密加工厂家优质供应商推荐榜 - 品牌鉴赏师

引言在当今制造业蓬勃发展的时代,精密加工行业作为制造业的关键环节,其发展水平直接影响着众多领域的产品质量和技术创新。为了帮助企业和消费者在众多精密加工厂家中做出更明智的选择,我们依据一系列科学、严谨的测…

二、分清假设、估计和偏差

本节我们来深入探讨财务智慧这个要素&#xff0c;理解财务“艺术”的一面。我们看下面三个例子&#xff0c;并提几个很简单但非常重要的问题&#xff1a;这些数字包含哪些假设&#xff1f;这些数字中有估计的成分吗&#xff1f;这些假设和估计引起的偏差是什么&#xff1f;产生…

程序员转型大模型全攻略:从零基础到高薪岗位的完整路径_30+程序员转行做什么工作比较好?这是最靠谱的答案

文章阐述了程序员在AI时代如何转型学习大模型技术&#xff0c;提供了从基础到进阶的完整学习路径。掌握大模型技术可带来10%-20%的薪资提升和更多职业可能性。作者分享了系统学习资料&#xff0c;包括视频教程、书籍、面试题和行业报告等&#xff0c;帮助程序员快速掌握核心技能…

全网热议!2026年衣柜环保板材推荐榜单,板材品牌选哪家? - 睿易优选

在选择衣柜环保板材时,了解不同品牌的特色和优势至关重要。2026年,市场上涌现了一些备受关注的品牌,如洛宁三环华兰木业有限公司、建楠、至臻、吉木和宏兰。这些品牌各自采用不同的环保材料与技术,确保产品符合现代…

2026年有实力的自流平型隧道防火涂料,隧洞防火涂料,涂刷型隧道防火涂料厂家选型参考指南 - 品牌鉴赏师

引言在2026年,随着交通基础设施建设的不断推进,自流平型隧道防火涂料、隧洞防火涂料以及涂刷型隧道防火涂料的市场需求日益增长。为了帮助广大用户在众多的厂家中选出有实力的产品,本选型参考指南应运而生。本指南依…

二级分销小程序怎么制作,分销系统哪个好用2026 - 码云数智

二级分销商城小程序是商家低成本获客、提升复购的利器。无需开发、免代码的SaaS平台,让搭建效率翻倍——1小时快速配置,3-7天即可上线功能完备的二级分销小程序商城。 分销商城系统开发,二级分销小程序制作分销商城…

微信小程序制作平台哪个好?2026零代码小程序制作平台排行 - 码云数智

想做小程序但不懂代码?小程序制作平台为你解决难题!无论是零基础创业者还是中小商家,都能通过可视化拖拽操作,将按钮、图片、表单等组件拖拽组合,打造专属页面;商品上架、订单管理、会员积分等功能无需开发,平台…

小程序制作一般需要多少钱?2026小程序制作费用一览表 - 码云数智

微信小程序开发费用全解析,选对方式省一半钱 在数字化经营浪潮下,微信小程序已成为企业拓客留客的核心工具,其开发费用也成为商家关注的焦点。市场报价从百元到数十万元跨度极大,核心差异源于开发方式的不同。下面…

[讨论]合川杀猪、牛栏和AI

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 jeri 2026-1-6 19:03 这里的改进&#xff0c;按软件方法的三种改进&#xff0c;物流变信息流比较接近&#xff08;原来是人工做围栏&#xff09;&#xff0c;但按书中的定义--可以提炼…

三、利润是个估计值

彼得德鲁克(Peter Drucker)有一句名言:利润是企业最主要的评价标准。赢利能力也是对管理者的一种评价方式&#xff1a;是为公司贡献了利润还是减少了赢利? 是每天都在为公司赢利想办法,还是仅仅做了自己的工作,只希望别出什么乱子?如果你不知道如何为赢利贡献点儿什么&#x…

谷歌将生成式AI融入Gmail

来源&#xff1a;维度网 谷歌本月开始在Gmail服务中推出一系列基于生成式AI的新工具&#xff0c;旨在帮助用户更高效地管理收件箱并加快邮件撰写速度。 Gmail用户现在可通过输入问题查找邮件&#xff0c;如询问“上个月遇到的招聘人员姓名”。谷歌还在测试新型收件箱&#xff…

2026年临沂纸护角批发厂家推荐榜单:防水纸护角、纸护角用纸、纸护角加厚纸、出口纸护角、加厚纸护角、防水防潮纸护角 - 海棠依旧大

随着绿色包装理念的深度普及及跨境贸易的持续升温,纸护角、纱管纸作为环保、可回收的包装材料,市场需求呈现稳步增长态势。临沂作为全国重要的物流之都和包装产业聚集地,凭借完善的产业链优势,成为纸包装材料的核心…

2026年知名的cnc精密机械加工,超高精密机械加工,五轴精密机械加工厂家行业热门推荐 - 品牌鉴赏师

引言在当今制造业蓬勃发展的时代,机械加工行业作为基础产业,其发展水平直接影响着众多领域的发展进程。为了帮助企业和相关从业者在海量的机械加工厂家中挑选出最适合的合作伙伴,我们依据一系列科学、严谨的测评方法…

2026年高品质卷帘门企业推荐榜单:诚信的钢质卷帘门公司与抗风卷帘门销售厂家精选分享 - 睿易优选

在2026年高品质卷帘门企业推荐榜单中,强调了诚信的钢质卷帘门公司和抗风卷帘门销售厂家的重要性。这些企业不仅具备优良的产品质量,还有着良好的信誉和口碑。榜单中提到的各大厂家,不论是在技术、材料还是售后服务方…

开发小程序一般多少钱?2026 微信小程序开发价格表 - 码云数智

微信小程序开发费用全解析:从SaaS到定制开发的成本与选择 在移动互联网时代,微信小程序已成为企业数字化转型的重要工具。然而,面对市场上琳琅满目的开发方案,从199元的"超低价"到数万元的定制服务,企业…

Windows卸载神器,超越系统自带

今天给大家推荐一款Windows的卸载工具&#xff0c;一款完全免费的软件&#xff0c;非常好用&#xff0c;有需要的小伙伴可以下载收藏。 Bulk Crap Uninstalle 免费开源的卸载工具 这款软件是一款免费开源的卸载工具&#xff0c;是比系统自带很多的&#xff0c;也是比系统自带…

LlamaIndex高级使用

什么是 LlamaIndex 在 Rag 发挥的作用 以及与传统 Rag 的区别 1.LlamaIndex 简介 LlamaIndex(原 GPT Index)是一个专门为大模型构建索引、检索和数据管道的框架,核心目标是让 LLM 更好地连接和利用私有数据。 传统 …

小白也能懂!RAG检索增强生成技术学习笔记,建议马上收藏!

RAG&#xff08;检索增强生成&#xff09;是一种结合信息检索和文本生成的技术&#xff0c;通过为大模型提供外部知识库&#xff0c;增强模型对问题的理解。其工作流程包括数据准备&#xff08;提取、分割、向量化、入库&#xff09;和应用阶段&#xff08;提问、检索、注入提示…