• Drop

    Drop

    drop.md


    commit bd8d27beb54ef2a7bb4162d43006792f9ceae361

    现在我们讨论了 trait,让我们看看一个由 Rust 标准库提供的特殊 trait,DropDrop trait 提供了一个当一个值离开作用域后运行一些代码的方法。例如:

    1. struct HasDrop;
    2. impl Drop for HasDrop {
    3. fn drop(&mut self) {
    4. println!("Dropping!");
    5. }
    6. }
    7. fn main() {
    8. let x = HasDrop;
    9. // Do stuff.
    10. } // `x` goes out of scope here.

    当在main()的末尾x离开作用域的时候,Drop的代码将会执行。Drop有一个方法,他也叫做drop()。它获取一个self的可变引用。

    就是这样!Drop的机制非常简单,不过这有一些细节。例如,值会以与它们声明相反的顺序被丢弃(dropped)。这是另一个例子:

    1. struct Firework {
    2. strength: i32,
    3. }
    4. impl Drop for Firework {
    5. fn drop(&mut self) {
    6. println!("BOOM times {}!!!", self.strength);
    7. }
    8. }
    9. fn main() {
    10. let firecracker = Firework { strength: 1 };
    11. let tnt = Firework { strength: 100 };
    12. }

    这会输出:

    1. BOOM times 100!!!
    2. BOOM times 1!!!

    tntfirecracker之前离开作用域(原文大意:TNT 在爆竹之前爆炸),因为它在之后被声明。后进先出。

    那么Drop有什么好处呢?通常来说,Drop用来清理任何与struct关联的资源。例如,Arc<T>类型是一个引用计数类型。当Drop被调用,它会减少引用计数,并且如果引用的总数为0,将会清除底层的值。