闭包

  1. 闭包是一种匿名函数,用来保存进变量 或者作为参数传递给其他函数,但是和函数不同
    的是允许捕获调用者作用域中的值
  2. 闭包可以带有泛型,Fn trait。
  3. 闭包可以为返回类型和参数推断类型,所以可以省略部分
  • 简单的闭包使用方法
1
2
3
4
5
6
7
fn main() {
let use_closure = || {
println!("This is a closure");
};
use_closure();
println!("Hello world!");
}
  • 闭包的语法格式
1
2
3
4
5
6
7
8
9
10
11
12
//函数的实现方式
fn add_one_v1(x: u32) -> u32 {
x+1
}
//闭包的实现方式
let add_one_v2 = |x: u32| -> u32 {x + 1};
//--------------------------------
//省略方法
//没有写类型和返回值
let add_one_v3 = |x| {x+1};
let add_one_v4 = |x| x+1;

  • 使用上述闭包
1
2
let a = add_one_v4(5);
let b = add_one_v3(5);
  • 闭包的自动推导

闭包可以为每个参数和返回值推导一个具体的类型,但是不能够推导两次

1
2
3
4
5
6
7
8
9
10
//第一次推导为string
let example_closure = |x| x;
let s = example_closure("hello".to_string());
println!("s = {}",s);
//二次推导报错
//let n = example_closure(5);
//println!("n = {}",n);
//改成下面就不会报错
let n = example_closure(5.to_string());
println!("n = {}",n);
  • 捕捉环境中的变量
1
2
3
4
let i  = 1;
let exe = |x| x+i; //i定义在函数体之外,然后在函数体内部捕获
let r = exe(5);
println!("r = {}",r);