是否可以在作用域末端同时丢弃和消耗自我?

时间:2018-12-14 11:33:37

标签: rust destructor move-semantics raii

给出一个结构,如何编写一个函数,以便在作用域结束时自动调用该函数,从而消耗self而不是使用&mut self(不同于Drop::drop)?

我想在该析构函数中调用将消耗该结构的每个字段的其他函数,并且我希望该析构函数被自动调用。

1 个答案:

答案 0 :(得分:2)

使用占位符值mem::replacemem::forget的组合可以实现:

use std::mem;

struct Foo;

impl Drop for Foo {
    fn drop(&mut self) {
        let to_drop = mem::replace(self, Foo); // a placeholder with empty/default members
        to_drop.dropping_function();
    }
}

impl Foo {
    fn dropping_function(self) {
        println!("dropping Foo!");
        // call other destructors here
        mem::forget(self);
    }
}

fn main() {
    let foo = Foo;
}  // dropping Foo!

但是要警告(引用docs of mem::forget):

  

在不运行其析构函数的情况下获得所有权并“忘记”该值

这意味着您需要确保自己删除Foo中包含的所有内容。