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
的作用是将所引用的变量的所有权转移至闭包内,通常用于使闭包的生命周期大于所捕获的变量的原生命周期(例如将闭包返回或移至其他线程)
发散函数绝不会返回。 它们使用 !
标记,这是一个空类型