1、函数简介
①、Rust 的函数使用关键字 fn 开头,函数名称使用snake case规范风格(所有字母小写并使用下划线分隔);
②、可以有一系列的输入参数,可以有一个返回值;
③、函数返回可以使用 return 语句,也可以使用表达式(末尾不带分号);
④、函数也可以不写返回类型,这种情况下,编译器会认为返回类型是unit();
⑤、可执行程序的入口是 fn main();
⑥、调用函数时,Rust不关心函数定义在哪(前后都无所谓),只要定义了就行;
⑦、Rust 函数体内可以定义其它模块,比如静态变量、常量、函数、trait、类型等。
2、函数实例
fn main() {
let num = add(1,2);
println!("{}",num)
}
fn add(x:i32,y:i32) -> i32{
x+y
}
3、函数返回值
需要注意语句和表达式的区别,表达式没有分号,有返回值。语句结尾有分号,没有返回值。
所以对于如下函数,如果函数体加上分号,则会报错:
fn add(x:i32,y:i32) -> i32{
x+y;
}
把 x+y; 变成表达式即可(去掉末尾的分号)。
4、发散函数
Rust 支持一种特殊的发散函数(Diverging functions),它的返回类型是感叹号 !。
如果一个函数根本就不能正常返回,那么它就可以这样写:
fn diverges() -> !{
//panic! 会直接导致栈展开,所以这个函数调用后面的代码都不会执行,它的返回类型就是!
panic!("函数不能返回");
}
发散函数的最大特点:可以被转换成任意一个类型。
在Rust 中,有下列情况返回类型都是 !:
1.panic! 以及基于它实现的各种函数/宏,比如unimplemented!、unreachable!
2.死循环loop{}
3.进程退出函数std::process::exit以及类似的libc 中的exec一类函数。
5、const fn
函数可以用 const 关键字修饰,这样的函数可以在编译阶段被编译器执行,返回值也被视为编译期常量。
需要注意的是:const 函数是在编译阶段执行的,因此相比普通函数有很多限制,并非所有的表达式和语句都可以在其中使用。
而且这个功能还没有完全稳定。