Drop 特征
用于实现 Drop 的值可以指定在超出范围时运行的代码:
struct Droppable { name: &'static str, } impl Drop for Droppable { fn drop(&mut self) { println!("Dropping {}", self.name); } } fn main() { let a = Droppable { name: "a" }; { let b = Droppable { name: "b" }; { let c = Droppable { name: "c" }; let d = Droppable { name: "d" }; println!("Exiting block B"); } println!("Exiting block A"); } drop(a); println!("Exiting main"); }
- Note that
std::mem::dropis not the same asstd::ops::Drop::drop. - Values are automatically dropped when they go out of scope.
- When a value is dropped, if it implements
std::ops::Dropthen itsDrop::dropimplementation will be called. - All its fields will then be dropped too, whether or not it implements
Drop. std::mem::dropis just an empty function that takes any value. The significance is that it takes ownership of the value, so at the end of its scope it gets dropped. This makes it a convenient way to explicitly drop values earlier than they would otherwise go out of scope.- This can be useful for objects that do some work on
drop: releasing locks, closing files, etc.
- This can be useful for objects that do some work on
讨论点:
- 为什么
Drop::drop不使用self?- 简答:如果这样的话,系统会在代码块结尾 调用
std::mem::drop,进而引发再一次调用Drop::drop,并引发堆栈 溢出!
- 简答:如果这样的话,系统会在代码块结尾 调用
- 尝试用
a.drop()替换drop(a)。