函数定义

  • 使用fn关键字定义函数;
  • 函数名使用snake_case规范命名;
  • 函数可以定义在main函数之前或之后,Rust 不关心函数定义于何处;
1
2
3
fn test_function(a: i32, b: bool) -> u32 {
	//...
}

函数参数

  • 函数可以定义多个参数,使用逗号,分隔;
  • 参数是函数签名的一部分;
  • 参数必须指定类型;

包含语句和表达式的函数体

函数体由一系列的语句和一个可选的结尾表达式构成。

  • 语句(Statements)是执行一些操作但不返回值的指令;
1
2
3
fn main() {
    let y = 6; //是一条语句
}
  • 表达式(Expressions)计算并产生一个值;

表达式会计算出一些值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个简单的数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。我们用来创建新作用域的大括号(代码块),{},也是一个表达式,例如:

1
2
3
4
5
6
7
8
fn main() {
    let x = 5;
    let y = {
        let x = 3;
        x + 1
    };
    println!("The value of y is: {}", y);
}

这个表达式:

1
2
3
4
{
    let x = 3;
    x + 1
}

是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意结尾没有分号的那一行 x+1,与你见过的大部分代码行不同。

在接下来探索具有返回值的函数和表达式时要谨记以下三点:

  • 表达式的结尾没有分号;
  • 表达式结尾加上分号,就变成了语句;
  • 语句不会返回值;

具有返回值的函数

函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。

  • 在 Rust 中,函数的返回值等同于函数体最后一个表达式的值;
  • 使用 return 关键字和指定值,可从函数中提前返回;
  • 大部分函数隐式的返回最后的表达式;

这是一个有返回值的函数的例子:

1
2
3
4
5
6
7
8
fn main() {
	let x = foo();
	println!("x = {}", x);
}

fn foo() -> i32 {
	10	//注意这里结尾没有分号,加上分号会报错
}

函数返回值的两种方式:

  • 使用return关键字+指定值;
  • 使用结尾表达式;