Rust – 掉落特性
Drop trait 让我们可以自定义当一个值即将超出范围时会发生什么。 Drop trait 对智能指针模式很重要。
Drop trait 功能在实现智能指针时使用。例如, Box
Drop trait 可用于清除超出范围的值。
句法:
trait Drop {
fn drop(&mut self);
}
变量的删除顺序与它们的创建顺序相反,因此 d 在 c 之前删除。在 Rust 中,当我们的实例超出范围时,会自动调用 drop。
借助给定的示例,很容易理解 drop 方法的工作原理:
示例 1:
Rust
struct SmartPointer {
data: String,
}
// implementing Drop trait
impl Drop for SmartPointer {
fn drop(&mut self) {
println!("Dropping SmartPointer with data `{}`!", self.data);
}
}
fn main() {
let _c = SmartPointer { data: String::from("my stuff") };
let _d = SmartPointer { data: String::from("other stuff") };
println!("SmartPointers created.");
}
Rust
struct New {
data: String,
}
impl Drop for New {
fn drop(&mut self) {
println!("Dropping New with data `{}`!", self.data);
}
}
fn main() {
let c = New { data: String::from("some data") };
println!("New created.");
drop(c);
println!("New dropped before the end of main.");
}
Rust
struct GeeksforGeeks
{
a : String,
}
impl Drop for GeeksforGeeks
{
fn drop(&mut self)
{
println!("Dropping the instance of GeeksforGeeks with data : {}", self.a);
}
}
fn main()
{
let value1 = GeeksforGeeks{a : String::from("This is ")};
drop(value1);
let _value2 = GeeksforGeeks{a: String::from("GFG Platform")};
}
输出 1:
SmartPointers created.
Dropping SmartPointer with data `other stuff`!
Dropping SmartPointer with data `my stuff`!
示例 2:
锈
struct New {
data: String,
}
impl Drop for New {
fn drop(&mut self) {
println!("Dropping New with data `{}`!", self.data);
}
}
fn main() {
let c = New { data: String::from("some data") };
println!("New created.");
drop(c);
println!("New dropped before the end of main.");
}
输出 2:
New created.
Dropping New with data `some data`!
New dropped before the end of main.
使用 std::mem::drop 提前删除值
std::mem::drop函数与 Drop trait 中的 drop 方法不同。我们可以通过在作用域结束之前传递我们想要删除的值来调用它。在 Rust 中,我们不能手动调用 Drop trait 的 drop 方法,但我们必须调用 std::mem::drop函数。
例子:
锈
struct GeeksforGeeks
{
a : String,
}
impl Drop for GeeksforGeeks
{
fn drop(&mut self)
{
println!("Dropping the instance of GeeksforGeeks with data : {}", self.a);
}
}
fn main()
{
let value1 = GeeksforGeeks{a : String::from("This is ")};
drop(value1);
let _value2 = GeeksforGeeks{a: String::from("GFG Platform")};
}
在上面的例子中,我们手动调用了 drop() 方法。 Rust 编译器抛出一个错误,我们不允许显式调用 drop() 方法。我们没有显式调用 drop() 方法,而是调用 std::mem::drop函数在值离开作用域之前删除它。
std::mem::drop函数的语法与 Drop trait 中定义的 drop()函数不同。 std::mem::drop函数包含作为参数传递的值,该值在超出范围之前将被删除。
输出:
Dropping the instance of GeeksforGeeks with data : This is
Dropping the instance of GeeksforGeeks with data : GFG Platform