给出一个结构,如何编写一个函数,以便在作用域结束时自动调用该函数,从而消耗self
而不是使用&mut self
(不同于Drop::drop
)?
我想在该析构函数中调用将消耗该结构的每个字段的其他函数,并且我希望该析构函数被自动调用。
答案 0 :(得分:2)
使用占位符值mem::replace
和mem::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
中包含的所有内容。