函数定义
- 使用
fn
关键字定义函数; - 函数名使用
snake_case
规范命名; - 函数可以定义在
main
函数之前或之后,Rust 不关心函数定义于何处;
fn test_function(a: i32, b: bool) -> u32 {
//...
}
函数参数
- 函数可以定义多个参数,使用逗号
,
分隔; - 参数是函数签名的一部分;
- 参数必须指定类型;
包含语句和表达式的函数体
函数体由一系列的语句和一个可选的结尾表达式构成。
- 语句(Statements)是执行一些操作但不返回值的指令;
fn main() {
let y = 6; //是一条语句
}
- 表达式(Expressions)计算并产生一个值;
表达式会计算出一些值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个简单的数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。我们用来创建新作用域的大括号(代码块),{},也是一个表达式,例如:
fn main() {
let x = 5;
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
这个表达式:
{
let x = 3;
x + 1
}
是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意结尾没有分号的那一行 x+1,与你见过的大部分代码行不同。
在接下来探索具有返回值的函数和表达式时要谨记以下三点:
- 表达式的结尾没有分号;
- 表达式结尾加上分号,就变成了语句;
- 语句不会返回值;
具有返回值的函数
函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->
)后声明它的类型。
- 在 Rust 中,函数的返回值等同于函数体最后一个表达式的值;
- 使用 return 关键字和指定值,可从函数中提前返回;
- 大部分函数隐式的返回最后的表达式;
这是一个有返回值的函数的例子:
fn main() {
let x = foo();
println!("x = {}", x);
}
fn foo() -> i32 {
10 //注意这里结尾没有分号,加上分号会报错
}
函数返回值的两种方式:
- 使用
return
关键字+指定值; - 使用结尾表达式;