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