如果我有:
struct Bar {}
struct Foo {
bar: Bar
}
impl Drop for Foo {
fn drop(&mut self) {}
}
impl Drop for Bar {
fn drop(&mut self) {}
}
fn main() {
let x = Foo { bar: Bar {} };
}
哪个滴叫先,Foo
滴还是Bar
滴?
Foo
的下降将在Bar
的下降之前调用。
如果反过来,&mut self
将指部分销毁的物体,self.bar
将是无效的。这对于Drop
的目标没有意义,因为在被销毁之前过于执行逻辑。
从参考:
类型
T
的析构函数包括:
- 如果
T: Drop
,则调用<T as std::ops::Drop>::drop
- 递归运行其所有字段的析构函数。
换句话说,在您的示例中,当x
超出范围时,Foo::drop
会在Bar::drop
(以及Foo
可能具有的任何其他字段)之前调用。
不过,最简单的方法是自己尝试一下。