一句话:主动捕获
编译器通过匿名函数的编写和实验时候所利用的参数来确定捕获了什么变量。 直接在函数体捕获外部变量
let mut z = 20;let mut closure2 = || { z += 1;};通过参数捕获(实为传参)
let fx=|y| y+1;let v=20;let r=fx(v);println!("{}+1={}",v,r); 处于图方便的缘故,第一种形式比较多,这一点在js中也是类似的。3.2、可变捕获
即不但捕获,还要在匿名函数体内改变被捕获变量的值。
如果采用”指定持有者变量“方式来定义此类匿名函数,那么必须把为这个变量指定mut关键字,例如:
let mut z = 20;let mut closure2 = || { z += 1;};如果不是,则不需要。 可变捕获后,有一个很特别的事情需要记住:一旦你利用了可变捕获捕获一个变量,那么在最后一次匿名函数被调用之前,你不能在父级作用域利用被捕获的变量。否则,编译器会提示:immutable borrow occurs here.或者提示 :cannot borrow `xxx` as mutable more than once at a time 3.3、所有权问题