2.2.4 函数
1 函数
1 |
|
该函数如此简单,但是又是如此的五脏俱全,声明函数的关键字
fn
,函数名 add()
,参数 i
和
j
,参数类型和返回值类型都是
i32
,总之一切那么的普通,但是又那么的自信,直到你看到了下面这张图:

1.1 函数要点
- 函数名和变量名使用 蛇形命名法(snake case),例如
fn add_two() -> {}
- 函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可
- 每个函数参数都需要标注类型
1.2 函数参数
Rust 是静态类型语言,因此需要你为每一个函数参数都标识出它的具体类型,例如:
1 |
|
another_function
函数有两个参数,其中 x
是
i32
类型, y
是 f32
类型,然后在该函数内部,打印出这两个值。
2 函数返回
在 Rust 中函数就是表达式,因此我们可以把函数的返回值直接赋给调用者。
函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用
return
提前返回,下面的函数使用最后一条表达式来返回一个值:
1 |
|
x + 5
是一条表达式,求值后,返回一个值,因为它是函数的最后一行,因此该表达式的值也是函数的返回值。
再来看两个重点:
let x = plus_five(5)
,说明我们用一个函数的返回值来初始化x
变量,因此侧面说明了在 Rust 中函数也是表达式,这种写法等同于let x = 5 + 5;
x + 5
没有分号,因为它是一条表达式,这个在上一节中我们也有详细介绍
再来看一段代码,同时使用 return
和表达式作为返回值:
1 |
|
plus_or_minus
函数根据传入 x
的大小来决定是做加法还是减法,若 x > 5
则通过
return
提前返回 x - 5
的值,否则返回
x + 5
的值。
2.1 Rust 中的特殊返回类型
2.1.1 无返回值 ()
对于 Rust 新手来说,有些返回类型很难理解,而且如果你想通过百度或者谷歌去搜索,都不好查询,因为这些符号太常见了,根本难以精确搜索到。
例如单元类型
()
,是一个零长度的元组。它没啥作用,但是可以用来表达一个函数没有返回值:
- 函数没有返回值,那么返回一个
()
例如下面的 report
函数会隐式返回一个
()
:
1 |
|
与上面的函数返回值相同,但是下面的函数显式的返回了
()
:
1 |
|
在实际编程中,你会经常在错误提示中看到该 ()
的身影出没,假如你的函数需要返回一个 u32
值,但是如果你不幸的以 表达式;
的语句形式作为函数的最后一行代码,就会报错:
1 |
|
错误如下:
1 |
|
还记得我们在 语句与表达式 中讲过的吗?只有表达式能返回值,而
;
结尾的是语句,在 Rust 中,一定要严格区分
表达式 和 语句
的区别,这个在其它语言中往往是被忽视的点。
2.1.2 永不返回的发散函数 !
当用 !
作函数返回类型的时候,表示该函数永不返回( diverge
function ),特别的,这种语法往往用做会导致程序崩溃的函数:
1 |
|
下面的函数创建了一个无限循环,该循环永不跳出,因此函数也永不返回:
1 |
|