Rust 函数

函数

defined

fn main() {
    print_sum(5, 6);
}

fn print_sum(x: i32, y: i32) {
    println!("sum is: {}", x + y);
}

函数定义时必须声明变量的类型,变量之间用逗号分隔。

返回值

fn add_one(x: i32) -> i32 {

x + 1 // 不可以加分号

}

表达式与语句 (expression VS statement)

(Rust is primarily an expression-based language. There are only two kinds of statements, and everything else is an expression.)

Rust 是以表达式为主的语言。在Rust中只有两种语句,其他的全是表达式。

语句和表达式的区别:表达式有返回值,而语句没有。语句: x+1; 没有返回值。并不是所有的分支都有返回值。 在Rust中有两种语句:声明式语句和表达式语句。其他的一切都是表达式。

在其他一些语言中可以连续声明相同的变量并赋值。如下:

x = y = 5

然而在Rust中,使用let声明变量并不是表达式。

let x = (let y =5); //compile-time error

Rust不想其他的语言可以连续赋值,在Rust中会被赋值为一个空的元组(),因为一个被“赋”的值只能有一个 owner

let mut y = 5;

let x = (y = 6);  // x has the value `()`, not `6`

Rust 中另一种语句就是表达式语句。它被如此设计的目的是可以将表达式变为语句。在实际的环境,有人喜欢在一行写多个语句,那么就需要分号间隔开两个语句了。这与大部分语言都相似。

fn add_one(x: i32) -> i32 {
    x + 1
}

但是这个例子就不可以用分号结束语句,否则 会返回 () ,但是编译器认为这样是不正确的,所以会在编译时期给出错误提示。

Rust也可以像其他语言 return返回。

fn foo(x: i32) -> i32 {
    return x + 1;
}

这种比较直观,但是明显 表达式 的写法更加有 逼格

diverging functions

原谅我的英语烂,实在不知道如何翻译!

这是Rust中的特殊语法,并不会有返回值!像java中的void

fn diverges() -> ! {
    panic!("This function never returns!");
}

panic! 是个宏指令!用于打印 程序运行时导致程序crash的信息。

这种函数可被用作任何类型

let x: i32 = diverges();
let x: String = diverges();

函数指针

看到这四个字不要慌,Rust不是c++!!!

let f: fn(i32) -> i32;

意思很明显,将f声明为一个函数类型,许多脚本语言中都有这种用法。

fn plus_one(i: i32) -> i32 {
    i + 1
}

// without type inference
let f: fn(i32) -> i32 = plus_one;

// with type inference
let f = plus_one;

let six = f(5);

只是 其用法要比许多脚本语言麻烦多了!