文章

Rust 函数

Rust

Rust 函数

Rust 函数

函数

Rust 通过 fn 关键字声明函数,函数和变量名的命名规范都使用 snake case 风格,所有字母都是小写且通过下划线进行分割。

fn main() {
  println!("Main Function");
  anthor_fn();
}
 
fn anthor_fn() {
  println!("Anthor Function");
}

Rust 并不关心函数的定义位置,你可以定义在 main 函数的前面和其他任何位置,这点和灵活的 JavaScript 是一样的。

参数

参数是特殊的变量,它属于函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供实际的值(实参);

在函数签名中,必须显式地声明每个参数的类型。这是 Rust 的一个设计:要求在函数定义中提供参数的类型注解,这有助于编译器理解你的意图并能给出更有用的错误提示信息。

定义多个参数时,使用 逗号 分隔:

fn main() {
  test(3, 'c');
}
 
fn test(x: i32, c: char) {
  println!("The value of x is: {x}, the value of c is {c}");
}

语句和表达式

Rust 也是一门基于表达式的语言,这也是与其他语言更显著的区别。

什么是语句?什么又是表达式?

语句:执行一些操作,但是不返回值的指令

表达式:计算并产生值

// 语句
let x = 123;
 
// 表达式
let y = {
  let x = 3;
  x + 1 // 表达式的结尾没有分号,如果加上了分号就变成了语句,这个代码块的值被直接绑定到了变量 y 上
}
 
println!("The value of y is: {y}");

具有返回值的函数

通过 -> 声明返回值的类型

在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。正由于是最后一个表达式的值,所以它并无分号

使用 return 关键字和指定值,可以从函数中提前返回,但大部分函数都是隐式返回的。

fn num() -> i32 {
  6
}
 
fn main() {
  let num = num();
 
  println!("The value of num is: {num}");
}

给函数加上参数

fn num(x: i32) -> i32 {
  x + 1
}
 
fn main() {
  let num = num(3);
 
  println!("The value of num is: {num}");
}

如果在 返回值的末尾加上分号,这会导致一个类型错误:

fn num(x: i32) -> i32 {
  x + 1; // 加上分号
}
 
fn main() {
  let num = num(3);
 
  println!("The value of num is: {num}");
}
   |
63 | fn num(x: i32) -> i32 {
   |    ---            ^^^ expected `i32`, found `()` // 语句不返回值,所以返回一个单位类型(),表示空值
   |    |
   |    implicitly returns `()` as its body has no tail or `return` expression
64 |   x + 1;
   |        - help: remove this semicolon to return this value // 编译器提示信息

主要是因为产生了类型不匹配的错误,并且 Rust 的编译器还会给你一条提示信息,帮助你去修改错误。

不得不说,Rust 的编译器真的牛~