语句和表达式
在rust里,语句和表达式的区别是非常重要的。语句没有返回值,表达式有返回值。例如:
fn main() {
let y = {
let x = 3; // 赋值语句
x + 1 // 表达式
};
println!("The value of y is: {}", y);
}
上面使用一个语句块表达式将值赋给 y 变量。一个重要的区别是,表达式不能以分号结尾。一旦给表达式加上分号,它就变成了语句,不再有返回值。
也可以视作语句的返回值是(),表达式的返回值是表达式本身计算之后的值。
需要注意的是let是语句,因此不能将let语句赋值给其他值。在下面介绍函数的时候,我们将更加深刻的理解语句和表达式的区别。
函数
在rust中,声明函数的关键字 fn。正如声明main函数使用的是fn一样。下面是一个函数的例子:
fn add(i: i32, j: i32) -> i32 {
i + j
}
声明函数的关键字 fn ,函数名 add(),参数 i 和 j,参数类型和返回值类型都是 i32。这看起来和其他大多数编程语言是一致的。但是细节上,可以看到没有使用return语句。这一点和前面提到的表达式有关。注意到i+j后面没有分号,它是一个表达式。在 Rust 中函数就是表达式,因此在没有使用return进行返回的时候。函数体中最后一个表达式的值,会被视为函数的返回值。我们来调用这个add函数看看。
fn main() {
let x = add(1, 2);
println!("{x}");
println!("{}", add(2,2));
}
fn add(i: i32, j: i32) -> i32 {
i + j
}
输出结果如下所示:
3
4
当函数没有返回值的时候,可以像下面这样显示的来声明返回值。
fn t1() -> () {
let x = 1;
println!("t1{x}");
x + 1
}
当然,也可以不进行显示的声明,例如:
fn t2() {
let x = 1;
println!("t2{x}");
}
因此,总体而言,在rust中函数值可以被return返回,也可以是函数体中最后一个表达式的值。如果函数没有返回值,那么将返回一个()。
发散函数
除了这些以外,rust中还有发散函数,这些函数永不返回。
当用 ! 作函数返回类型的时候,表示该函数永不返回( diverge function ),特别的,这种语法往往用做会导致程序崩溃的函数:
fn dead_end() -> ! {
panic!("你已经到了穷途末路,崩溃吧!");
}
下面的函数创建了一个无限循环,该循环永不跳出,因此函数也永不返回:
fn forever() -> ! {
loop {
//...
};
}
函数声明的语法
函数的声明语法下图说的非常明白。
参考资料
rust圣经