Drop
现在我们讨论了trait,让我们看看一个由Rust标准库提供的特殊trait,Drop
。Drop
trait提供了一个当一个值离开作用域后运行一些代码的方法:例如:
struct HasDrop;impl Drop for HasDrop { fndrop(&mut self) { println!("Dropping!"); }}fnmain() { let x = HasDrop; // do stuff} // x goes out of scope here
当在main()
的末尾x
离开作用域的时候,Drop
的代码将会执行。Drop
有一个方法,他也叫做drop()
。它获取一个self
的可变引用。
这就是全部!Drop
的机制非常简单,不过这有一些细节。例如,值会以与它们声明相反的顺序被丢弃(dropped)。这是另一个例子:
struct Firework { strength: i32,}impl Drop for Firework { fndrop(&mut self) { println!("BOOM times {}!!!", self.strength); }}fnmain() { let firecracker = Firework { strength: 1 }; let tnt = Firework { strength: 100 };}
这会输出:
BOOM times 100!!!BOOM times 1!!!
tnt
在firecracker
之前离开作用域(原文大意:TNT在爆竹之前爆炸),因为它在之后被声明。先进,后出。
那么Drop
有什么好处呢?通常来说,Drop
用来清理任何与struct
关联的资源。例如,Arc<T>
类型是一个引用计数类型。当Drop
被调用,它会减少引用计数,并且如果引用的总数为0,将会清除底层的值。