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

- 所有的闭包都实现了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);
}