07-函数

89 阅读3分钟

前言

在之前的文章中,我们给出的大部分的例子中,都有一个 main 函数,我们之前说过,main 函数是 Rust 的入口函数。那么,在 Rust 当中,除了 main 函数之外,其他的函数应该如何定义呢?他的参数和返回值跟其他语言又有什么不同呢?我们今天就来一探究竟。

函数的声明

就像我们之前所见的 main 函数一样,我们在 Rust 当中,定义一个函数需要使用 fn 关键字,这个跟我们在 TS/JS 当中使用的 function 关键字的作用是一样的。

函数的命名规范

Rust 当中,函数的名、变量名推荐使用全小写的英文字母和数字表示(不能以数字开头),英文单词之间用 _ 分隔。

fn main() {
  test_fn();
}
fn test_fn() {
    println!("Hello, world!");
}

image-20240121163741584

细心的同学可能发现了,在我上面给出的代码中,test_fn 是定义在 main 函数之后的,而在截图当中,test_fn 则是在 main 函数之前的。那么,函数声明和被调用的顺序对 Rust 来说有什么影响吗?其实是没有影响的,上面两种方式得到的结果都是一样的,这与我们在 TS/JS 当中的 变量提升 的概念很像,即使我们把函数声明在后面,调用语句写在前面,也可以正常使用。

函数的参数

在函数的声明里面,必须要明确声明每一个参数和类型,这一点就跟 TS/JS 中不太一样了,在 TS/JS 当中,我们可以不写参数,然后再运行时通过 argumengs...args 的方式获取到所有的参数。

形参 - parameters

形参,即形式参数,就是我们在定义函数的时候我们定义的参数名和类型。

实参 - arguments

实参,即实际参数,也就是我们在调用函数的时候,实际上传进去的值。

fn main() {
    test_fn(5, "kiner"); // arguments
}
fn test_fn(val: i32, name: &str) {
    // parameters
    println!("The val is {}!,The name is {}", val, name);
}

image-20240121165315957

语句和表达式

函数体由一系列的语句组成。在语句中,可能会包含一些表达式

// 整一个函数定义是一个语句
fn main() {
  // 这一整行也是一个语句
  let x = 3;// 字面值 3,不包括分号,是一个表达式,表达式必定对应一个值,如字面值 3 对应的值就是 3,如果后面改成:5 + 6 ,那么 5 + 6 是一个表达式,而这个表达式对应的值就是 11
}

返回值

Rust 当中,也可以像 TS/JS 一样使用 return 关键字返回值,但有返回值的时候,需要在函数声明里面使用 -> 定义这个返回值的类型:

fn main() {
    let return_val = test_fn(5, "kiner"); // arguments
    println!("The return val is {}", return_val);
}
fn test_fn(val: i32, name: &str) -> &str {
    // parameters
    println!("The val is {}!,The name is {}", val, name);

    return name;
}

image-20240121170900218

TS/JS 不一样的是,如果我们没有显式的写 return 关键字指定返回值,Rust 默认会将函数中最后一个表达式的值作为返回值,如果没有表达式,则返回值是一个 () 空的值。

fn main() {
    let return_val = test_fn(5, "kiner"); // arguments
    println!("The return val is {}", return_val);
}
fn test_fn(val: i32, name: &str) -> &str {
    // parameters
    println!("The val is {}!,The name is {}", val, name);
    // 最后一个表达式的值会被隐式的返回
  	// 注意,不能给 name 加分号,加了分号就说明这个不是一个表达式了,而是一个语句
    name
}

image-20240121171144789

结语

函数的定义和使用方法比较简单,需要注意的是返回值如果不显式的使用 return 语句明确指定的话,会默认使用函数中的最后一个表达式作为返回值,注意,表达式不能加分号,不然就不是表达式了,而是语句了。其他的跟其他语言都差不多,就不多赘述了。