函数和控制流

专栏简介:本专栏作为Rust语言的入门级的文章,目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言,虽然历史没有C++、和python历史悠远,但是它的优点可以说是非常的多,既继承了C++运行速度,还拥有了Java的内存管理,就我个人来说,还有一个优点就是集成化的编译工具cargo,语句风格和C++极其相似,所以说我本人还是比较喜欢这个语言,特此建立这个专栏,作为学习的记录分享。

日常分享:每天努力一点,不为别的,只是为了日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!


目录

函数

参数

控制流

if表达式

循环语句

loop循环语句

循环标签

while循环

for 遍历循环

总结


函数

函数的声明在多个编程语言中均有被提到,函数这个功能应该算是一门编程语言中举足轻重的功能。使用函数可以使功能更加规格化,更加具有逻辑条例。增加代码的可读性。

和C++不同的是,Rust语言所有的函数声明均是使用关键字fn来实现。和Python中的def关键字一样,这样为我们省去了很多的麻烦。

 
fn main() {pr_Hello();
}
fn pr_Hello()
{println!("Hello,world!");
}

上面的例子就是创建了一个无参的函数,如果我们要创建含参的函数又该如何?

参数

我们可以定义为拥有 参数parameters)的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments),但是在日常交流中,人们倾向于不区分使用 parameterargument 来表示函数定义中的变量或调用函数时传入的具体值。

fn main() {And(3,4);
}
fn And(x:i32, y:i32) ->i32
{let num:i32=(x+y);println!("x+y: {}",num);return num;
}

 上面的例子中的一个函数的作用是将两个数加起来,函数中定义了两个参数,参数类型都是i32的,在定义行参的时候,一定要注明参数类型,同时,细心的小伙伴应该会发现,函数的后面存在一个箭头符号,并且指向了i32数据类型,这是代表函数的返回值是i32类型的,也就是函数是否有返回值的标志。

控制流

控制流,顾名思义就是控制程序语句执行情况的的语句,包括条件语句,循环语句等语句,这里就介绍一些常用的控制语句。

if表达式

if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。”

与if语句相匹配的是else或者else if。其实通过中文意思就可以知道他们的作用,无非就是判断是否满足条件,然后根据判断情况来执行代码。

fn main() {let num= And(5,6);println!("num: {:?}", num);
}
fn And(x:i32, y:i32) ->i32
{let mut number;if(x>y){println!("x bigger than y");number=x-y;}else if (x==y){println!("x equals y");number=x;}else{println!("x smaller than y");number=y+x;}return number;
}

 上面给出的例子中,使用了if,else if,else语句,除此之外,每个判断语句都没有使用括号括起来。一定要注意这点,和C++有点区别。在Rust中,if语句还是有很多缺陷,比如说,他不能自动把非布尔值转换成布尔值,也就是判断条件只能是布尔值。而且if,else语句太过臃肿,代码结构不够美观,为了解决这种缺点,Rust中还有一种很好的分支判断结构叫做——模式匹配(match)。后面会介绍,这里就简单的了解一点。

循环语句

循环语句就是指将一段代码重复使用的一种方式,使用的很多,所以这里我们必须要详细的介绍一下。

loop循环语句

loop循环语句有点像MySQL中的用法有点相似,loop循环语句也叫无限循环语句,只有当你确定跳出循环的时候,才能跳出。

fn loops(mut i:i32, mut j:i32)->i32
{loop{if i==j{break i;}else if i<j{//i+=1;i=i+1;j=j-1;}else{i=i-1;j=j+1;}}
}

 loop语句中,使用了break i;这种语句格式,这个和c++中的语句不同,他可以终止循环语句,同时返回后面的表达式的值。谈到返回值,在一个函数中,函数的返回值类型必须一样。除了break可以跳出循环外,还有一种语句——continue。可以结束此次迭代,进入下次迭代。

循环标签

如果存在嵌套循环,breakcontinue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签loop label),然后将标签与 breakcontinue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。

fn main() {let mut count = 0;'counting_up: loop {println!("count = {count}");let mut remaining = 10;loop {println!("remaining = {remaining}");if remaining == 9 {break;}if count == 2 {break 'counting_up;}remaining -= 1;}count += 1;}println!("End count = {count}");
}

 这里的标签可以理解为其实就是一种值为“counting_up”的变量,然后绑定到loop上,只要loop的返回值为变量的值,则这个表达式正确,开始执行。

while循环

while循环语句和其他语言中的一样,当判断条件为true时,执行循环,否则结束循环;

fn main()
{While();}
fn While()
{let mut i=0;while i!=100{println!("{}",i);i+=1;}
}

 这种结构消除了很多使用 loopifelsebreak 时所必须的嵌套,这样更加清晰。当条件为 true 就执行,否则退出循环。个人比较推荐使用这种。

for 遍历循环

for循环作为最常见的循环,在c++,java等语言中均有使用,不过Rust语言中的书写格式和Python中的书写格式很相似。

fn main()
{let a:[i32;5]=[1,2,3,4,5];for i in a{println!("{}",i);}}

Rust还提供了一种简单的数据便利:

fn main()
{let a:[i32;5]=[1,2,3,4,5];for i in (0..5){println!("{}",a[i]);}}

这里使用的是一种类似于Python中的range的容器,可以很快的书写,同时也提供了 反转函数rev。

fn main() {for number in (1..4).rev() {println!("{number}!");}println!("LIFTOFF!!!");
}

总结

最后,再介绍一下函数的注释,Rust的注释分为单行注释(//)和多行注释(/*  */)。这个语法和c++几乎一样。所以就没在主文中介绍了。对于本篇文章,主要是介绍了Rust中的一些简单的关键字以及用法,下一节进入“所有权”的学习。拜拜了你勒!!!

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

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

相关文章

7.运算符优先级

优先级运算符顺序1小括号 &#xff08;&#xff09; 2一元运算符 -- &#xff01; 3算数运算符先* / %后 -4关系运算符> > < <5相等运算符 &#xff01; &#xff01;6逻辑运算符先&&后||7赋值运算符8逗号运算符&#xff0c; 一…

Simulink仿真模块 - Data Store Read

Data Store Read:从数据存储中读取数据 在仿真库中的位置为:Simulink / Signal Routing 模型为: 说明 Data Store Read 模块将指定数据存储中的数据复制到其输出中。多个 Data Store Read 模块可从同一个数据存储读取数据。 用来读取数据的源数据存储由 Data Store Memory 模…

Ceph的部署与应用

文章目录 Ceph的部署与应用一.存储基础1.单机存储设备(1)DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09;(2)NAS&#xff08;网络附加存储&#xff0c;是通过网络附加到当前主机文件系统之上的存储&#xff09;(3)SAN&#xff08;存…

vue+element-ui通用后台管理系统(适合新手)

vueelement-ui通用后台管理系统&#xff08;适合新手&#xff09; 1、使用到的技术 使用vue2element-uiaxiosjs-cookielessecharts实现的一个简易的通用后台管理系统&#xff0c;具有很强的可扩展性&#xff0c;修改简单&#xff0c;只要有点前端基础就能看懂&#xff1b; 2…

怎么学习Java数据库连接(JDBC)? - 易智编译EaseEditing

学习Java数据库连接&#xff08;JDBC&#xff09;是掌握Java与数据库交互的关键步骤。以下是学习Java JDBC的一些建议&#xff1a; 先掌握Java基础&#xff1a; 在学习JDBC之前&#xff0c;确保你已经掌握了Java的基本语法、面向对象编程和其他核心概念。这将有助于更好地理解…

webpack学习

1.webpack 项目-----》装载器------》插件------》浏览器 loader&#xff1a;将浏览器不能识别的文件转化为html&#xff0c;js&#xff0c;css 插件&#xff1a;对文件进行处理像压缩&#xff0c;合并等 入口&#xff1a; 出口&#xff1a; 创建webpack webpack init -y webp…

Spring、SpringBoot、SpringCloud、SpringCloud Alibaba、Elasticsearch版本对应,附下载地址

1、GitHub Alibaba 发布SpringCloud Alibaba和SpringCloud 、SpringBoot版本 Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot2022.0.0.0-RC2Spring Cloud 2022.0.03.02022.0.0.0-RC1Spring Cloud 2022.0.03.0.02021.0.5.0*Spring Cloud 2021.0.52.6.132021.0.4…

js代码优化

感觉有点基础&#xff0c;不过还是记一下&#xff0c;遇到了至少有话说 语言特性 避免全局查找&#xff1a;在JavaScript中&#xff0c;全局变量的查找会比局部变量更耗时。因此&#xff0c;尽量将常用的变量存储为局部变量&#xff0c;以减少作用域链的查找时间。 避免过度使…

蓝桥杯上岸每日N题第三期(一)!!!

大家好 我是寸铁&#x1f4aa; 考前需要刷大量真题,大家一起相互监督&#xff0c;每日做N题&#xff0c;一起上岸吧✌️ ~ 冲刺蓝桥杯省一模板大全来啦 &#x1f4a5; ~ 蓝桥杯4月8号就要开始了 &#x1f64f; ~ 还没背熟模板的伙伴们背起来 &#x1f4aa; &#x1f4aa; &…

0基础学C#笔记03:进制转换

文章目录 前言一、十进制转二进制、八进制、十六进制1、类方法:使用Convert类方法ToString2、自己写:二、二进制、八进制、十六进制转十进制1、使用Convert类方法ToInt322、自己写经验总结扩展延伸1.十六进制转浮点数2、浮点数转十六进制数前言 首先我们知道在计算机当中所有…

uni-app 用法总结

1、跳转页面 this.$tab.navigateTo(/pages/mine/info/index) 2、接收跳转页面的参数 this.$tab.navigateTo(/pages/mine/info/index?abcccc) 获取页面传递的参数 this.$route.query.abc 3、动态设置导航标题 uni.setNavigationBarTitle({ // 接收到的title标题 …

基于FPGA的softmax函数优化及实现

文章目录 前言优化方案测试数据产生及Matlab结果处理流程工程说明功耗与面积标准softmax函数功耗与面积总结前言 FPGA异构计算是一个趋势,在AI推理、深度学习中广泛使用FPGA进行加速,减小系统延迟。而AI推理中有一个组件被广泛使用,各种网络模型中都有其身影,那就是激活函…

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems&#xff08;CCF-A&#xff09;https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

【C++修炼之路】内存管理

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、C/C 内存分布二、考题三、C语言动态内存管理方式四、C内存管理方式1、对内置类型2、对自定义类型 五、C对动态管理的升级六…

【Scheme】Scheme 编程学习 (二) —— 基础

【Scheme】Scheme 编程学习 (二) —— 基础 文接前一节内容 : 【Scheme】Scheme 编程学习(一) —— 概述 本文章可以跟视频课程一起看&#xff0c;做了一些补充说明 原视频地址&#xff1a; Bilibili https://www.bilibili.com/video/BV1Kt411R7Wf/?p2&spm_id_frompage…

Html基础知识学习——圣杯布局、margin负值、等高布局(十七)

文章目录 圣杯布局margin负值等高布局 圣杯布局 两边页面固定中间页面宽度随着浏览器大小自适应 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

mmdetection3.1.0 训练自己的数据集

目录 前言安装mmcv安装mmdetection验证安装数据集转为COCO划分训练集、验证集及测试集安装PaddlePaddle安装PaddleX划分数据集 修改对应文件修改coco.py重新安装修改模型文件 训练测试测试带真值的图像测试不带真值的图像批量测试 错误集锦ValueError: need at least one array…

Kafka

1.定义 Kafka&#xff1a;一个分布式基于发布/订阅模式的消息队列。 发布者发布消息进入队列后&#xff0c;每个订阅者都能在一定时间内获取发布的消息&#xff08;Kafka&#xff1a;消费者通过主动拉取pull队列&#xff09;。 缺点&#xff1a;即使没有消息&#xff0c;消费者…

如何解决VScode远程下载插件不了的问题?如何手动安装插件?

当我们在使用VScode进行远程操作时&#xff0c;在安装我们所需要的一些插件时&#xff0c;可能会出现如下图&#xff0c;一直卡在安装中....明明只有小几十MB&#xff0c;却一连好几个小时都一动不动。像这种情况&#xff0c;就需要我们进行手动安装该插件。 插件网站&#xff…