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 这样的语句,并使得 xy 变量同时拥有6这个值,但这在Rust中是行不通的。

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

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

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

举个🌰:

rust 复制代码
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. 结语

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

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

相关推荐
yngsqq15 分钟前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
古希腊掌管学习的神16 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师16 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
就爱学编程24 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
oneouto25 分钟前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh3230 分钟前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
每天都要学信号1 小时前
Python(第一天)
开发语言·python
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论