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"); }
This slide should take about 8 minutes.
- 请注意,
std::mem::drop
与std::ops::Drop::drop
不同。 - 当值超出范围时,系统会自动将其删除。
- 丢弃某个值时,如果该值实现了
std::ops::Drop
,则会调用其Drop::drop
实现。 - 然后,该值所有字段也会被丢弃,无论其是否实现了
Drop
。 std::mem::drop
只是一个采用任何值的空函数。重要的是它获得了值的所有权,因此在其作用域结束时便会被丢弃。如此您可以轻松提前明确地丢弃值,而不必等到值超过范围的时候。- 这对于通过
drop
执行任务的对象来说非常有用,例如释放锁、关闭文件等。
- 这对于通过
讨论点:
- 为什么
Drop::drop
不使用self
?- 简答:如果这样的话,系统会在代码块结尾 调用
std::mem::drop
,进而引发再一次调用Drop::drop
,并引发堆栈 溢出!
- 简答:如果这样的话,系统会在代码块结尾 调用
- 尝试用
a.drop()
替换drop(a)
。