Rust 闭包fn,Fn,FnMut,FnOnce 和move关键字

struct ABC<B,C,D>
where
	B: Fn(),	//可以捕获 引用
	C: FnMut(),	//可以捕获 可变引用
	D: FnOnce()	//可以捕获 移动
{
          
   
	A:fn(),//不能捕获环境
	B:B,
	C:C,
	D:D,
}

fn main() {
          
   
	let mut a=String::from("aaa");
	let mut f = ABC{
          
   
		A:||{
          
   
			// println!("{}",&a);//报错,fn类型不能捕获环境
		},
		B:||{
          
   
			// println!("{}",&a);//aaa
		},
		C:||{
          
   
			// let a=&mut a;
			// *a = String::from("bbb");
		},
		D:||{
          
   
			a;//所有权移动进函数
		},
	};
	println!("{}",a);//报错,没有所有权
}

作为参数

fn f<F>(f:F)
where F:Fn() {
          
   
	f();
}
fn main() {
          
   
	f(||{
          
   });
}

作为返回值

fn f1() -> impl Fn(i32) {
          
   
	|x|{
          
   println!("{}",x)}
}
fn f2() -> impl Fn(i32) {
          
   
	let a=100;
	move |x|{
          
   println!("{}",x+a)}//如果不获取所有权,那么a就死亡,后期调用就会异常,所以编译器不会通过
}
fn main() {
          
   
	f1()(9);//9
	f2()(9);//109
}

使用 move 会强制闭包取得被捕获变量的所有权 关键字move的作用是将所引用的变量的所有权转移至闭包内,通常用于使闭包的生命周期大于所捕获的变量的原生命周期(例如将闭包返回或移至其他线程)

发散函数绝不会返回。 它们使用 ! 标记,这是一个空类型

参考

经验分享 程序员 微信小程序 职场和发展