Files
LearnRustEasy/src/chapter_3/chapter_3_16_4.md
2023-05-29 10:04:53 +08:00

1.5 KiB
Raw Blame History

3.16.4 Drop trait

1. Drop trait

Drop trait类似于其它语言中的析构函数当值离开作用域时执行此函数的代码。可以为任何类型提供Drop trait的实现。

为一个类型实现Drop trait的示例如下:

struct Dog(String);

//下面为Dog实现Drop trait
impl Drop for Dog {
    fn drop(&mut self) {
        println!("Dog leave");
    }
}

fn main() {
    let _a = Dog(String::from("wangcai"));
    let _b = Dog(String::from("dahuang"));
}

运行该代码,会有如下结果:

注释

在上面示例代码中并没有打印语句但是在drop方法中实现了打印可以看到当_a和_b离开作用域时自动调用了drop方法。

2. 通过std::mem::drop提早丢弃值

当要显示的清理值时不能直接调用Drop trait里面的drop方法而要使用std::mem::drop方法,示例如下:

struct Dog(String);

//下面为Dog实现Drop trait
impl Drop for Dog {
    fn drop(&mut self) {
        println!("Dog leave");
    }
}

fn main() {
    let _a = Dog(String::from("wangcai"));
    let _b = Dog(String::from("dahuang"));
    //a.drop();//错误不能直接调用drop
    drop(_a); //正确通过std::mem::drop显示清理
    println!("At the end of main");
}

代码运行结果如下:

注释

第一个“Dog leave”打印是第14行调用释放_a产生最后一个“Dog leave”打印则是_b离开作用域时调用drop方法产生。