从零开始的Rust生活:02-函数

函数是什么

相信各位学Rust的读者应该多少接触过至少一门程序语言,不过这里我还是会按照我的理解尽可能的去为函数做一个相对更为简单的定义。

对于Rust来说,函数的意义与大多数的程序语言都很相似,我们可以将其视作程序中的一个功能模块。这个功能模块可以对一些我们会反复使用的代码进行封装,从而大幅度简化程序的开发过程。

Rust的函数长什么样

Rust中声明一个函数需要用到fn关键字,通常一个函数的样子形如

1
2
3
fn func(arg1: T1, arg2: T2) -> T{
//do something
}
其中func()就是喜闻乐见的函数名,而T则对应的是他的返回类型,括号里面则是函数需要传入的参数,类比到C++可以就像下面这样
1
2
3
T func(T1 arg1, T2 arg2){
//do something
}
对于Rust的函数,他的返回值和参数的参数列表都是可选的,比如下面的代码就声明了一个不需要传入参数的函数
1
2
3
fn func() -> T{
//do something
}
而下面这样则声明了一个没有返回值的函数
1
2
3
fn func(arg1:T){
//do something
}
众所周知的是一个函数如果声明了返回类型后,其就必须有一个返回值。和大多数语言一样,rust可以使用return返回一个值,就像这样
1
2
3
fn return_one() -> i32{
return 1;
}
但是对于Rust来说,还有另外一种方式可以用来作为返回值使用,在多数情况下Rust的开发者们也更倾向使用这种方式进行返回,就像下面这样
1
2
3
4
fn mul(x: i32, y:i32) -> i32{
let t = x * y;
t
}
我们可以看到的是函数内的最后一行的t后面并没有;,但是我们又知道Rust每行代码最后必然会有;。而在一个有返回值的函数中,通常这样的写法会出现在整个函数的末尾,他的含义等价于return t;
另外,Rust不止可以返回一个确定的变量,其同样可以将一个表达式作为返回值,就像下面这样
1
2
3
fn mul(x:i32, y:i32) -> i32{
x * y
}
这个函数的功能等价于上一个mul(),但是它并没有声明一个中间变量t,而是选择直接返回x*y,这样的行为在Rust中是合法的,它同样可以实现目标功能而不会出现任何不可预期的问题。

关于闭包

Rust中也存在着一个类似于很多语言中所存在的lambda的存在,那就是闭包。
闭包本质上是一个匿名的函数,其被广泛应用于Rust的多线程处理中,本节中不会讨论闭包,因为在整个Rust学习的前期闭包基本不会被提到。


从零开始的Rust生活:02-函数
http://anyin233.github.io/2020/11/23/Rust-02/
Author
anyin233
Posted on
November 23, 2020
Licensed under