闭包,即匿名且可以捕获环境的函数,是Rust中非常有用的功能。我们在此研究一下lambda function怎么捕获环境。当然啦,如果想把这个问题搞得彻底透彻,我们是需要读Rust compiler或者rust standard library的源代码的。我只是通过尝试,从工程的角度来研究一下这个问题。
首先,每个闭包都有自己独特的type,这点跟C++很类似。但是,我们并不需要获取其类型,因为所有闭包都实现了Fn
, FnMut
, FnOnce
其中的一个。这几个trait
的区别在于如何捕获环境:
Fn
从环境捕获不可变引用,即&T
FnMut
从其环境捕获可变引用,即&mut T
FnOnce
从其环境获得变量所有权,即T
让我们来一一实践。
let s = 33;
let test = || {
let t = s + 44;
t
};
let res = test();
println!("{},{}",res,s);
上面的代码就是典型的通过实现Fn
来捕获环境。
let mut s = String::from("good");
let mut test = || {
let t = &mut s;
t.push_str("