美文网首页
Rust利用自定义drop实现defer

Rust利用自定义drop实现defer

作者: 黑天鹅学院 | 来源:发表于2021-10-17 14:16 被阅读0次

在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函数中执行闭包。

相关文章

网友评论

      本文标题:Rust利用自定义drop实现defer

      本文链接:https://www.haomeiwen.com/subject/mxuvwltx.html