函数
基本函数形式:
fn five() -> i32 {
5
}
fn plus_one(x:i32) -> i32 {
x + 1
}
main函数
fn main() {
// code
}
无返回值的的函数。
fn print_number (x: i32) {
println!("x is :{}",x);
}
fn print_sum (x:i32, y :i32) {
println!("sum is {}" , x + y); // 这是一个带有两个输入值无返回的函数
}
函数的输入值类型必须明确,不能是推导类型。以下函数无法通过编译。
fn print_sum (x, y) {
println!("sum is {}",x + y);
}
rust基于表达式,所以函数大多数情况下不需要return返回值,最后一行不含;
的结果会被当做return返回。
fn sum (x:i32, y :i32) -> i32 {
x + y // 注意!不要带分号';'
}
若返回值以;
结尾。编译器会认为这一行返回的类型是()
匿名函数类型,而不是i32类型。所以以下函数无法通过编译。
fn sum (x:i32, y :i32) -> i32 {
x + y; // 编译错误。
}
作用域
一般认为一组括号 { } 内的变量命名空间为一个作用域。
- 作用域内的变量名会覆盖作用域外的变量名。
- 作用域内的变量不会影响作用域外的变量。作用域一旦退出,作用域内的变量即失效。
例:
fn main() {
let x = 5;
let y = {
let x = 3; // 内部x覆盖外部x,此时x = 3
x + 1 // x + 1为表达式,计算的到4
}
println!("y={},x={}",y,x); // y=4,x=5
// y 被赋值为4,作用域退出,x以外为外部作用域的值,即5。
}
return
Rust可以使用return来返回值,不被推荐使用。在Rust中return一般用于函数逻辑执行中途返回值。
fn foo(x:i32) -> i32{
if x < 5 {return x};
return x + 1;
}
改进foo
函数,可以改写成下面的简单方式
fn foo(x:i32) -> i32{
if x < 5 {
x
} else {
x + 1
}
}
某些情况下,return可以用于控制语句中的提前返回。
递归调用
例:求斐波那契数列的第n个值。
fn fib(n:i32)->i32 {
if n <= 0 {
0
} else if n == 1 {
1
} else {
fib(n-1) + fib(n-2)
}
}