Skip to content

函数

函数的形式如下:

1
2
3
4
5
6
7
// 定义函数
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 中默认将最后一个表达式作为块({} 之间称为一个块)的返回值。

例如:

1
2
3
4
5
6
7
fn function() {
    let res = {
        let x = 1;
        x + 10
    };
    println!("{}", res);    // 打印11
}

两种特殊的返回值

无返回值 ()

如果一个函数没有返回值,其实默认返回了一个单元类型 ()

例如:

1
2
3
fn abc(a: i32) {
    a = 1;
}

其实等价于

1
2
3
fn abc(a: i32) -> () {
    a = 1;
}

永不返回 !

当用 ! 作为函数返回值时,表示该函数永不返回,这种在 Rust 中定义为 发散函数 diverge function。这种语法往往用做会导致程序崩溃的函数。

1
2
3
fn dead() -> ! {
    panic!("你完了");
}

下面这种创建一个无限循环的函数,也是发散函数,因为她永不返回。

1
2
3
4
5
fn forever() -> ! {
    loop {
        // ...
    };
}