每个Rust程序至少有一个函数,那就是:main
函数:
fn main(){
}
这是最简单的函数声明方式。就像我们之前提到的那样,关键字fn
(function缩写) 表明这是一个函数,fn
后面跟上函数名,接着是()
用来放函数的参数,最后是{ }
放函数体。下面是另一个函数:
fn foo(){
}
那么,函数有一些参数怎么样呢?请看:
fn print_number(x:i32){
println!("x is :{}",x);
}
下面是使用print_number
函数的完整程序:
fn main(){
print_number(5);
}
fn print_number(x:i32){
println!("x is :{}",x);
就像你看到的那样,函数参数和let
声明一样:在参数名后添加:
和参数类型
不像let
,你一定要声明函数参数的类型。下面的代码是错误的:
fn print_number(x,y){
println!("sum is :{}",x+y);
}
编译程序,得到这样的错误:
src/main.rs:5:18: 5:19 error: expected one of `:` or `@`, found `,`
src/main.rs:5 fn print_number(x,y){
如果函数有一个返回值是怎样的呢?这里有个函数,作用是向一个整数加1:
fn add_one(x:i32)->i32{
x+1
}
Rust函数返回一个值,可以在”arrow”,即->
后面声明返回值类型。函数体的最后一行决定着函数的返回值,要注意返回值的表达式是没有”;
“符号的。
diverging functions即分支函数
Rust为分支函数准备了一些特殊的函数,分支函数是一类不返回的函数:
fn diverges() -> ! {
panic!("This function never returns!");
}
与println!
相似,panic!
也是一个宏。与println
不同,panic()
会引起当前执行的线程崩溃,并且会给出一些信息。
因为这个函数会引起崩溃,所以它永远不会返回,函数返回值是!
,读作"diverge"
,一个分支函数可以被当作任何类型:
let x: i32 = diverges();
let x: String = diverges();