函数
函数的形式如下:
| // 定义函数
fn 函数名([形参: 类型, 形参: 类型...]) [-> 返回值类型] {
函数体
}
// 调用函数
函数名(实参)
|
| // 无参无返回值
fn function_1() {
}
// 有参无返回值
fn function_2(arg: i32) {
}
// 无参有返回值
fn function_3() -> i32 {
}
// 有参有返回值
fn function_4(arg: i32) -> i32 {
}
|
- 形参的类型不能省略;
- 函数的返回值不可以命名;
- 函数的返回值就是函数体里最后一个 表达式 的值;
- 可以使用
return
关键字显式的返回;
| // 5 是一个表达式,所以这里 5 是函数 five() 的返回值
fn five() -> i32 {
5
}
// num + 1 没有分号,也是一个表达式,在这里就是函数 add() 的返回值
fn add(num: i32) -> i32 {
let x = 1;
num + 1
}
fn sub(num: i32) -> i32 {
let x = 1;
return num - 1;
}
|
Tip
表达式 与 语句 区别在于有没有分号。表达式 没有分号,语句 有。
Rust 中默认将最后一个表达式作为块({}
之间称为一个块)的返回值。
例如:
| fn function() {
let res = {
let x = 1;
x + 10
};
println!("{}", res); // 打印11
}
|
两种特殊的返回值
无返回值 ()
如果一个函数没有返回值,其实默认返回了一个单元类型 ()
。
例如:
| fn abc(a: i32) {
a = 1;
}
|
其实等价于
| fn abc(a: i32) -> () {
a = 1;
}
|
永不返回 !
当用 !
作为函数返回值时,表示该函数永不返回,这种在 Rust 中定义为 发散函数 diverge function
。这种语法往往用做会导致程序崩溃的函数。
| fn dead() -> ! {
panic!("你完了");
}
|
下面这种创建一个无限循环的函数,也是发散函数,因为她永不返回。
| fn forever() -> ! {
loop {
// ...
};
}
|