函数

基本函数形式:

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)
    }
}

results matching ""

    No results matching ""