# 函数

前言

关键字fn

# 1.普通函数

# 1.参数

Rust 中定义函数如果需要具备参数必须声明参数名称和类型

# 2.函数体

用 {} 包括的块里编写一个较为复杂的表达式

# 3.返回值

关键字return

函数声明返回值类型的方式:在参数声明之后用 -> 来声明函数返回值的类型

fn add(a: i32, b: i32) -> i32 {
    return a + b;
}
1
2
3

# 2.闭包

Rust 中的闭包是一种匿名函数,它们可以捕获并存储其环境中的变量

  • 闭包格式: |参数...| { 表达式 }
let add = |a, b| a + b;
println!("{}", add(2, 3)); // 输出: 5
1
2

# 3.1 Fn闭包

不捕获上下⽂变量,或者捕获上下⽂变量的只读引⽤

# 3.1.1 参数

  • 1.传入参数

参数可以有类型注解,也可以省略,Rust 编译器会根据上下文推断它们。

let add_one = |x: i32| x + 1;
1
  • 2.上下文中的变量
let x = 10;
let closure = || println!("{}", x); // 捕获只读引用
closure();
1
2
3

# 3.1.2 返回值

闭包可以有零个或多个参数,并且可以返回一个值

let calculate = |a, b, c| a * b + c;
1

# 3.1.3 调用

闭包可以像函数一样被调用

let result = calculate(1, 2, 3);
1

# 3.2 FnMut闭包

捕获上下⽂变量的可写引⽤

# 3.2.1 参数

  • 1.上下文中的变量
let mut x = 10;
let mut closure = || {
    x += 1;// 捕获可写引用
    println!("{}", x);
};
closure();
println!("{}", x);
1
2
3
4
5
6
7

# 3.2.2 返回值

闭包可以有零个或多个参数,并且可以返回一个值

let calculate = |a, b, c| a * b + c;
1

# 3.2.3 调用

闭包可以像函数一样被调用

let result = calculate(1, 2, 3);
1

# 3.3 FnOnce闭包

上下⽂变量拥有的值的所有权将会被转移到闭包中,这也是为什么 它只能被调⽤⼀次(Once),因为只有⼀次机会转移所有权,再次调⽤的时候就会出错了

# 3.3.1 参数

  • 1.上下文中的变量所有权被转移
let s = String::from("Hello world!");
let closure = move || {
  let tp = (s, 1);
  println!("{:?}", tp);
 };
closure();
1
2
3
4
5
6

# 3.3.2 返回值

闭包可以有零个或多个参数,并且可以返回一个值

let calculate = |a, b, c| a * b + c;
1

# 3.3.3 调用

闭包可以像函数一样被调用

let result = calculate(1, 2, 3);
1