zl程序教程

您现在的位置是:首页 >  Java

当前栏目

rust语句,表达式以及函数

2023-02-18 16:35:59 时间

语句和表达式

在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圣经