闭包获取环境中的值

闭包通过三种方式从环境中捕获变量,对应三种获取参数的方式,分别是所有权、可变
借用、不可变借用。
三种捕获的方式被编码为如下三个Fn trait :

  1. FnOnce消费从周围作用域中捕获的变量,周围的作用域被称作其环境,为了消费捕获
    到的变量,闭包必须获取所有权并且在闭包定义的过程中将其移动至闭包内部,Once代表
    不能够多次获取相同变量所有权
  2. FnMut获取可变的借用值,可以改变作用环境
  3. Fn从环境中获取不可改变的借用值

rust通过自己的编译器来推导用户的闭包如何使用:

  1. 所有的闭包都实现了FnOnce,因为所有闭包都至少被调用一次。
  2. 并且在闭包的调用过程中没有移动被捕获变量的所有权到闭包的闭包实现了FnMut,
  3. 不需要对捕获的变量进行可变访问的闭包实现了Fn
1
2
3
4
5
6
fn main() {
let x = 4;
let equal_to_x = |z| z == x; //x为环境中的变量
let y = 4;
assert!(equal_to_x(y));
}
  • move关键字会将所有权移进闭包
1
2
3
4
5
6
7
let x = vec![1,2,3];
let equal_to_x = move |z| z==x; //将x的所有权移动至闭包内部
//x在这里被dropped,会报错
//println!("x = {:?}",x);

let y = vec![1,2,3];
assert!(equal_to_x(y));