Rust Drop trait

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");
}Rust

执行上面示例代码,得到以下结果 -

Instances of Example type are created
Dropping the instance of Example with data : 20
Dropping the instance of Example with data : 10Shell

程序代码说明

  • 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");
}Rust

执行上面示例代码,得到以下结果 -

在上面的例子中,手动调用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");
}Rust

执行上面的示例代码,得到以下结果 -

Dropping the instance of Example with data : Hello
Instances of Example type are created
Dropping the instance of Example with data : WorldShell

在上面的示例中,通过在drop(a1)函数中将a1实例作为参数传递来销毁a1实例。

(0)

相关推荐

  • 为什么 Python 没有函数重载?如何用装饰器实现函数重载?

    英文:https://arpitbhayani.me/blogs/function-overloading 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者) 声 ...

  • C ++:单例

    介绍 单身人士几乎不需要介绍.一个搜索CodeProject上单独变成了关于他们的50余篇. 那为什么还要写另一篇文章呢?好吧,各种各样的问题不断涌现,我想讨论一下.关于稳健服务核心(RSC)实现单例 ...

  • use关键字在PHP中的几种用法

    use关键字在PHP中的几种用法 在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空 ...

  • Rust基础学习笔记(零):复习基本知识

    由于一个学期没有碰Rust,相关知识殆已忘尽.最近各课逐渐停授,余出时间来从基础重温这些知识,也算是对没有写的基础知识的补充.另外这次复习主要参照了Youtube上的Crush Course视频,两个 ...

  • Rust Deref trait

    Deref <T> trait用于自定义解除引用运算符(*)的行为. 如果实现Deref <T>特征,则可以将智能指针视为参考. 因此,在引用上工作的代码也可以用在智能指针上. ...

  • U.S. birth and fertility rates drop to another record low, CDC says

    U.S. birth and fertility rates in 2020 dropped to another record low as births fell for the sixth co ...

  • (40条消息) 基于腾讯云的 Rust 和 WebAssembly 函数即服务

    腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架.腾讯云最近发布的 SCF custom runtime(自定义运行时)更进一步 -- SCF 现在可以支持用任何编程语言编写的函数. 本文 ...

  • 报告:JavaScript 开发者达1380 万,C#超越 PHP,Rust 增长最快

    出品|开源中国 文|白开水 研究公司 SlashData 最新发布的"State of the Developer Nation"第 20 版报告指出,全球开发者社区在过去六个月中 ...

  • 揭秘全球开发最新趋势!JS开发者达1380万,C#超越PHP,Rust增长最快

    白开水 OSC开源社区 昨天 文 | 白开水 出品 | OSC开源社区(ID:oschina2013) 研究公司 SlashData 最新发布的"State of the Developer ...

  • 【每日一练】drop it

    有时候我们在说某个事情时觉得不想再说下去了,这时,你想到的话是不是: Let's not talk about it anymore. 我们不要再谈这事了. 这句话没问题,不过,有个更为形象.地道的说 ...

  • C 和 C 不安全?Android 支持 Rust 开发操作系统

    Rust这两年实火了. 近年来,Rust凭借着出色的内存效率.速度与安全性,深受亚马逊.微软.华为.Facebook等科技巨头的青睐.Rust从根本上考虑安全性,提出了"没有数据竞争的并发性 ...

  • pandas 处理缺失值[dropna、drop、fillna]

    墨氲 2018-09-22 18:37:18 分类专栏: Python数据处理及可视化 文章标签: Python pandas 版权 面对缺失值三种处理方法: option 1: 去掉含有缺失值的样本 ...

  • C4D和AE制作光线小球Motion Drop

    --  微资讯 · 微课程  -- 利用零碎时间,走上超神之路! 使用软件: Cinema4D 教程质量:6颗星 教程难度:2颗星 课程总结: 拖尾的运动使用的预设文件制作,不过感兴趣的同学可以自己尝 ...