第二个重要的 trait 是 Drop,其允许在值要离开作用域时执行一些代码,所指定的代码被用于释放类似于文件或网络连接的资源。
Drop trait 要求实现一个叫做 drop 的方法,它获取一个 self 的可变引用。结构体 CustomSmartPointer 实现了放置清理代码的 Drop trait:
//Drop trait 包含在 prelude 中无需导入
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
//打印一些文本以可视化地展示 Rust 何时调用 drop
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}
//当实例离开作用域 Rust 会自动调用 drop,并调用指定的代码
//变量以被创建时相反的顺序被丢弃,所以 d 在 c 之前被丢弃
复制代码
通过 std::mem::drop 提早丢弃值
Rust 并不允许主动调用 Drop trait 的 drop 方法,如果想在作用域结束之前就强制释放变量的话,应该使用的是由标准库提供的 std::mem::drop。
尝试手动调用 Drop trait 的 drop 方法提早清理,编译会报错:
fn main() {
let c = CustomSmartPointer {
data: String::from("some data"),
};
println!("CustomSmartPointer created.");
c.drop();
println!("CustomSmartPointer dropped before the end of main.");
}
复制代码
在值离开作用域之前调用 std::mem::drop 显式清理:
fn main() {
let c = CustomSmartPointer {
data: String::from("some data"),
};
println!("CustomSmartPointer created.");
drop(c);
println!("CustomSmartPointer dropped before the end of main.");