06-Rust-闭包 Fn、FnMut、FnOnce和 与move

06-Rust-闭包 Fn、FnMut、FnOnce 与move

  • 重点 move
  • 一、 闭包类型
    • 1、最基本类型
    • 2、FnOnce例子
    • 3、FnMut例子

06-Rust-闭包 Fn、FnMut、FnOnce和 与move_第1张图片

  • 所有的闭包都实现了FnOnce
  • 没有移动【捕获变量所有权】的闭包都实现了FnMut;
  • 无需可变访问捕获变量的闭包实现了Fn;

重点 move

在参数列表前使用了move关键字,可以强制闭包取得它所使用的环境中的所有权。

  • 将闭包传递给线程最用用

一、 闭包类型

1、最基本类型

let example_closure = |x| x+1;
let res = example_closure(1);
assert_eq!(res,1);

2、FnOnce例子

fn test<T: FnOnce()>(f:T)
{
    f();
}

fn main(){
    let  num : Box<i32> = Box::new(1);
    let next = || {
        let _num = num;
    };
    test(next);

}

3、FnMut例子

fn test<T>(mut f:T)
where T: FnMut()
{
    f();
}

fn main(){
    let mut num : Box<i32> = Box::new(1);
    let next = || {
        *(&mut num) = Box::new(num.as_ref() + 1);
        println!("next number : {}",num);
    };
    test(next);
    
}

你可能感兴趣的:(Rust基础,rust)