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)
。