006、函数

1. 一个小技巧

        在前面文章中,我们提到,在黑窗口中输入 code . 命令可以快速在 Visual Studio Code 中打开新建的项目,这个是你刚刚新建了项目,并且黑窗口正好是打开的情况下。

        如果是之前创建的项目,用上面的方法就会有点麻烦了。现在,你可以先点进该项目的根目录,然后在文件夹中的空白处鼠标右键,在弹出的菜单中找到 通过 Code 打开 单击即可。

        如果你和我一样也是 Windows 11 系统, 通过 Code 打开 选项被隐藏在 显示更多选项 中了,你可以先按住 Shift键 然后再鼠标右键就可以看到 通过 Code 打开 这个选项了。

        这两种方式结合使用,可以稍微提高一些效率。

 

2. 函数

        这篇文章我们来学习一下Rust中的函数,下面思维导图中就是接下来要讲的内容:

        函数(function)在Rust中的应用非常广泛,在之前的文章中,我们已经接触到了最为重要的main函数了,它是大部分程序开始的地方。你应该也对 fn 关键字有印象,可以用它来声明一个新的函数。 

        Rust代码使用蛇形命名法(snake case)来作为规范函数和变量名称的风格。蛇形命名法只使用小写的字母进行命名,并以下画线分隔单词。下面就是一个包含函数定义的示例:

        在Rust中,函数定义以 fn 关键字开始并紧随函数名称与一对圆括号,另外还有一对花括号用于标识函数体开始和结尾的地方。我们可以使用 函数名 + 圆括号 的方式来调用函数。 

        Rust不关心你在何处定义函数,只要这些定义对于使用区域是可见的即可。因此,你可以在 main 函数之前定义,也可以在 main 函数之后定义,都是没有问题的。

2.1 函数参数

        在函数签名中,你必须显式地声明每个参数的类型。这是在Rust设计中设计者们经过慎重考虑后做出的决定:由于类型被显式地注明了,因此编译器不需要通过其他部分的代码进行推导就能明确地知道你的意图。

        代码示例:

 

        另外,你可以像下面一样,通过使用逗号分隔符来为函数声明多个参数:

 

        注意哈,这里我给两个值声明的都是 i32 类型,实际可以是不同类型。 

2.2 函数体中的语句和表达式

        函数体由若干条语句组成,并可以以一个表达式作为结尾。

        由于Rust是一门基于表达式的语言,所以它将语句(statement)与表达式(expression)区别为两个不同的概念,这与其他某些语言不同。 

        语句 指那些执行操作但不返回值的指令,而 表达式 则是指会进行计算并产生一个值作为结果的指令。

        举个🌰:

let x = 5; //这是语句

        C语言或Ruby语言中的赋值语句会返回所赋的值。在这些语言中,你可以编写类似于 x = y = 6 这样的语句,并使得 x y 变量同时拥有6这个值,但这在Rust中是行不通的。

        与语句不同,表达式会计算出某个值来作为结果。你在Rust中编写的大部分代码都会是表达式。以简单的数学运算 5 + 6 为例,这就是一个表达式,并且会计算出值11。

        另外,表达式本身也可以作为语句的一部分。语句 let x = 5; 中的字面量5就是一个表达式,它返回5作为自己的计算结果。调用函数是表达式,调用宏是表达式,我们用来创建新作用域的花括号 { } 同样也是表达式

        假如我们在表达式的末尾加上了分号,这一段代码就变为了语句而不会返回任何值。

        举个🌰:

fn main() {let x = 5;let y = {let x = 3;x + 7};println!("y的值为:{}", y);
}

2.3 函数的返回值

        函数可以向调用它的代码返回值。虽然你不用为这个返回值命名,但需要在箭头符号 -> 的后面声明它的类型。在Rust中,函数的返回值等同于函数体最后一个表达式的值。你可以使用 return 关键字并指定一个值来提前从函数中返回,但大多数函数都隐式地返回了最后的表达式。下面是一个带有返回值的函数示例: 

        在以上的 five 函数中,除了数字5,没有任何其他的函数调用、宏调用,甚至是 let 语句,但它在Rust中确实是一个有效的函数。注意,这个函数的返回值类型通过 -> i32 被指定了。 

        其次,这里的 five 函数没有参数,仅仅定义了返回值的类型。函数体中除了孤零零的、不带分号的5,没有任何东西,而它也正是我们想要用来作为结果返回的表达式。

        再看一个🌰:

        如果我们在 plus_one 函数中的 x + 1 后面加上分号, 就会报错。

        这是因为我们在定义 plus_one 的过程中声明它会返回一个 i32 类型的值,但由于语句并不会产生值,所以Rust默认返回了一个空元组,也就是上面描述中的()。实际的返回值类型与函数定义产生了矛盾,进而触发了编译时错误。

3. 结语

        为了让大家有更好的阅读体验,标题我用橘色标注,子标题用蓝色标注。如果你对角角的文章有其它方面的建议或要求,非常欢迎你在评论区留言,角角一定酌情采纳并应用到后面的文章中。

        最后,码字不易,如果大家能给我一个赞,我也会动力满满,万分感谢你们的支持!

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

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

相关文章

【力扣100】207.课程表

添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度,然后使用队列进行入度为0的元素的进出# 数组:下标是课程号,array[下标]是这个课程的入度# 哈希…

SpringMVC源码解析——DispatcherServlet初始化

在Spring中,ContextLoaderListener只是辅助功能,用于创建WebApplicationContext类型的实例,而真正的逻辑实现其实是在DispatcherServlet中进行的,DispatcherServlet是实现Servlet接口的实现类。Servlet是一个JAVA编写的程序&#…

自然语言处理2——轻松入门情感分析 - Python实战指南

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

【逗老师的无线电】ICOM IC-705终端模式Terminal Mode直连反射器配置-外置Pi-Star网关篇

各位友台大家好呀,逗老师最近整了一台IC-705,最吸引人的莫过于这玩意可以通过USB连接树莓派直接进行通联。下面简单介绍一下这个功能和其配置方法 一、功能 终端模式Terminal Mode允许IC-705电台作为终端直接连接反射器,基于不同的连接方式…

纯CSS3制作优惠券线性UI效果

纯CSS3制作优惠券线性UI效果-遇见你与你分享

java并发编程一 并发编程的基本概念

进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行&…

C# 如何使用?、? 和 ??的区别和使用案例

目录 ? 运算符 使用案例 ?? 运算符 使用案例 总结 在 C# 中,? 和 ?? 运算符在处理 null 值时起着不同的作用,并且具有特定的使用场景。 ? 运算符 ? 运算符,也称为空条件运算符,在 C# 6.0 及更高版本中引入。它允许…

关于“Python”Django 管理网站的核心知识点整理大全52

目录 注意 18.2.2 激活模型 settings.py 18.2.3 Django 管理网站 1. 创建超级用户 注意 2. 向管理网站注册模型 admin.py 注意 3. 添加主题 Climbing。 18.2.4 定义模型 Entry models.py 18.2.5 迁移模型 Entry 18.2.6 向管理网站注册 Entry admin.py 往期快速…

fastjosn利用分析

fastjosn一般是使用TemplatesImpl链来进行攻击的,在上面其实已经分析过fastjson在反序列化的时候会调用满足条件的getter方法,因此就会调用TemplatesImpl类的getOutputProperties方法,然后通过getOutputProperties,调用newTransfo…

Qt QAction添加图片

QAction用的时候,时常需要添加图片,如上图所示,代码如下所示: 测试的图片格式包含png,jpg,bmp,svg,其他未测试

Solidworks学习笔记

本内容为solidworks的学习笔记,根据自己的理解进行记录,部分可能不正确,请自行判断。 学习视频参考:【SolidWorks2018视频教程 SW2018中文版软件基础教学知识 SolidWorks自学教程软件操作教程 sw视频教程 零基础教程 视频教程】 h…