drop trait
用于在值超出范围时释放文件或网络连接等资源。drop trait
用于释放Box <T>
指向的堆上的空间。drop trait
用于实现drop()
方法,该方法对self
进行可变引用。
下面来看一个简单的例子:
struct Example
{
a : i32,
}
impl Drop for Example
{
fn drop(&mut self)
{
println!("Dropping the instance of Example with data : {}", self.a);
}
}
fn main()
{
let a1 = Example{a : 10};
let b1 = Example{a: 20};
println!("Instances of Example type are created");
}
执行上面示例代码,得到以下结果 -
Instances of Example type are created
Dropping the instance of Example with data : 20
Dropping the instance of Example with data : 10
程序代码说明
- 在
Example
类型上实现了Drop trait
,并在Drop trait
的实现中定义了drop()
方法。 - 在
main()
函数中,创建了Example
类型的实例,并且在main()
函数的末尾,实例超出了范围。 - 当实例移出作用域时,Rust会隐式调用
drop()
方法来删除Example
类型的实例。 首先,它将删除b1
实例,然后删除a1
实例。
注意 : 不需要显式调用
drop()
方法。 因此,可以说当实例超出范围时,Rust会隐式调用drop()
方法。
使用std::mem::drop尽早删除值
有时,有必要在范围结束之前删除该值。如果想提前删除该值,那么使用std::mem::drop
函数来删除该值。
下面来看一个手动删除值的简单示例:
struct Example
{
a : String,
}
impl Drop for Example
{
fn drop(&mut self)
{
println!("Dropping the instance of Example with data : {}", self.a);
}
}
fn main()
{
let a1 = Example{a : String::from("Hello")};
a1.drop();
let b1 = Example{a: String::from("World")};
println!("Instances of Example type are created");
}
执行上面示例代码,得到以下结果 -
在上面的例子中,手动调用drop()
方法。 Rust编译器抛出一个错误,不允许显式调用drop()
方法。不是显式调用drop()
方法,而是调用std::mem::drop
函数在值超出范围之前删除它。
std::mem::drop
函数的语法与Drop trait
中定义的drop()
函数不同。 std::mem::drop
函数包含作为参数传递的值,该值在超出范围之前将被删除。
下面来看一个简单的例子:
struct Example
{
a : String,
}
impl Drop for Example
{
fn drop(&mut self)
{
println!("Dropping the instance of Example with data : {}", self.a);
}
}
fn main()
{
let a1 = Example{a : String::from("Hello")};
drop(a1);
let b1 = Example{a: String::from("World")};
println!("Instances of Example type are created");
}
执行上面的示例代码,得到以下结果 -
Dropping the instance of Example with data : Hello
Instances of Example type are created
Dropping the instance of Example with data : World
在上面的示例中,通过在drop(a1)
函数中将a1
实例作为参数传递来销毁a1
实例。