在Rust中,当一个变量生命周期终结时,会自动进行变量回收,一般情况下,这个回收过程是自动完成的,比如一个新建的struct
会被自动释放内存,但是在某些情况下,需要自定义drop的实现以完成一些复杂的处理。
考虑一个CallOnDrop的场景:
- 该函数的执行顺序不与代码顺序绑定
- 该函数能够读取当前上下文中的变量
这个场景与Golang中的defer
颇有神似:
func main() {
let num = 5;
defer fmt.Println("hello, defer", num)
fmt.Println("exit")
}
Rust并没有提供类似的能力,但是可以借助于自定义drop
来模拟同样的行为:
struct CallOnDrop<F: Fn()>(F);
impl<F: Fn()> Drop for CallOnDrop<F> {
fn drop(&mut self) {
(self.0)();
}
}
fn test() {
println!("start");
let num = 5;
println!("before");
let _p = CallOnDrop(move || println!("read var {}", num));
println!("after");
println!("exit");
}
fn main() {
test();
}
由于drop总是在变量销毁的时候被调用,所以首先创建一个结构体保存闭包,在该结构体被销毁时,在自定义drop函数中执行闭包。
网友评论