函数和控制流

专栏简介:本专栏作为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.hqwc.cn/news/21341.html

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

相关文章

ELK日志记录——Kibana组件——grok 正则捕获插件、mutate数据修改插件、multiline 多行合并插件、date 时间处理插件

grok 正则捕获插件 grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明&…

【Java】一只小菜坤的编程题之旅【2】

文章目录 1丶丑数2、各位相加3丶搜索插入位置4丶第一个错误的版本 1丶丑数 因为丑数只能被2&#xff0c;3&#xff0c;5整除&#xff0c;所以让n依次去除2&#xff0c;3&#xff0c;5&#xff0c;如果最后是n为1&#xff0c;就说明是丑数。 class Solution {public boolean is…

C语言实现扫雷【经典】

前言   本篇文章要实现的是扫雷游戏&#xff0c;其代码实现与上一篇的三子棋游戏类同&#xff0c;都是在棋盘的基础上&#xff0c;与电脑进行对抗&#xff0c;不同的是&#xff0c;扫雷游戏一开始电脑就已经随机布置好了所有“雷”。 请戳 --->三子棋 扫雷游戏 1. 扫雷游…

Kafka入门,offset的默认维护位置(二十一)

offset的默认维护位置 0.9版本之前&#xff1a;consumer默认将offset保持在zookeeper中 从0.9版本开始&#xff0c;consumer默认将offset保存在kafka一个内置的topic中&#xff0c;该topic为__consumer_offsets __consumer_offsets 主题里面采用key和value方式存储数据&#x…

SQL 删除重复的电子邮箱

196 删除重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id是该表的主键列。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 删除 所有重复的电…

Spring Boot 中的 SQL 注入攻击是什么,原理,如何预防

Spring Boot 中的 SQL 注入攻击是什么&#xff0c;原理&#xff0c;如何预防 随着互联网的发展&#xff0c;Web 应用程序的数量不断增加&#xff0c;而 SQL 注入攻击也成为了常见的网络安全问题之一。SQL 注入攻击是通过在 Web 应用程序中注入恶意的 SQL 代码&#xff0c;从而…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

03-2_Qt 5.9 C++开发指南_Qt全局定义、容器类、容器类的迭代器、Qt类库的模块

本篇简要介绍Qt全局定义中的数据类型、函数、宏定义&#xff1b;容器类中&#xff1a;顺序容器类、关联容器类&#xff1b;容器类的迭代器&#xff1b;Qt类库的模块。 文章目录 1.Qt全局定义1.1 数据类型定义1.2 函数1.3 宏定义1.3.1 QT_VERSION1.3.2 QT_VERSION_CHECK1.3.3 Q…

ModaHub魔搭社区:AI原生云向量数据库MIlvus Cloud实现 HNSW

实现 HNSW HNSW 并不简单,因此我们只在此处进行最简单的实现。像之前一样,我们首先创建一组(128 维)向量的数据集: >>> import numpy as np >>> dataset = np.random.normal(size=(1000, 128)) 第一步是构建 HNSW 索引。为此,我们需要将每个向量添加…

理清ROS通信的一些细节

目标&#xff1a;掌握ros的python编程 基本教程&#xff1a;https://www.bilibili.com/video/BV1sU4y1z7mw/?spm_id_from333.788&vd_source32148098d54c83926572ec0bab6a3b1d terminator 快捷键需要自己去重新启用 ctrlshifte 横向分屏 ctrlshifto 纵向分屏 ctrlshiftw …

C基础day7(2023.7.7)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;二维数组地址 int main(int argc, const char *argv[]) {int arr[2][3]{11,22,33,44,55,66};for(int i0;i<2;i){for(int j0;j<3;j){printf("arr[%d][%d]%p\n",i,j,&arr[i][j]);}}…

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、归并排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0…