Rust 拖慢开发速度,刚来实习生被折磨哭了
创始人
2025-07-10 18:41:25
0

大家好,我叫渔夫。

Rust 如果你掌握了,开发速度也是惊人的,如还不够熟悉基本概念、特性、标准库等使用,那么写 Rust 无疑就是和编辑器做斗争的,前期非常痛苦,还好现在的 IDE 非常智能。

今天,我们来一起看这个非常实用的 Trait。

Drop

Drop 的作用就是释放实现者的实例拥有的资源,意思是当一个值的拥有者消失的时候,Rust 会丢弃这个值,通常用于资源清理。实际中,比如关闭文件、网络连接或释放内存等等场景。

例子:

struct FileResource {}

impl Drop for FileResource {
    fn drop(&mut self) {
        println!("FileResource 被销毁,资源被释放。");
    }
}

fn main() {
    {
        let resource = FileResource {};
    }

    println!("FileResource 已离开作用域。");
}

这个例子中,定义一个简单的空结构体 FileResource,如果这个结构,不再被使用时应该执行释放掉的。

然后,去实现 Drop 特质,这个方法将在结构体的实例中,不再使用时自动被调用。在 drop 方法中,实际我们会编写一些释放资源的相关代码。本实例,作为演示只打印了一条消息来表示 drop 方法被调用了。你也可以做类似如关闭文件、断开网络连接或释放分配的内存等相关逻辑。

main 函数,在作用域中创建实例 resource  ,当这个作用域结束时,那么resource 会自动离开作用域,这时 Rust 自动调用,也可以理解为它的生命周期也就结束了,不可再被使用了。

离开作用域后,Rust 将负责调用 drop 方法来执行清理工作。这也是 Rust 自动资源管理和“析构”行为,目的应该是防止资源泄漏及资源滥用情况。

最后打印结果:

FileResource 被销毁,资源被释放。
FileResource 已离开作用域。

Clone

Clone 的作用适用在,允许一个对象的实例被显式地复制。当你的类型实现了 Clone 特质,那么就可以使用其 clone 方法来创建该类型的一个新实例,这个新实例与原始实例一模一样,但拥有不同的内存地址。

使用场景也是非常广泛的,如:

  • 避免共享可变引用
  • 保持原始数据不变
  • 传递数据给函数
  • 实现非原子或复杂类型的默认行为
  • 缓存或备份

使用 Clone 通常涉及深拷贝,对于大型或复杂的数据结构,性能内存使用情况,也需要考虑。

例子:

#[derive(Clone)]
struct DemoStruct {
    field: i32,
}

fn main() {
    let original = DemoStruct { field: 23 };
    let clone = original.clone(); // 相当于创建一个副本

    println!("原始对象的 field: {}", original.field);
    println!("克隆对象的 field: {}", clone.field);
}

执行结果:
原始对象的 field: 23
克隆对象的 field: 23

Copy

Copy 特质也是一样允许一个类型的值在赋值或作为函数参数传递时被隐式复制。这个通常适用于小型和简单的值类型,如整数和浮点数等。

当允许一个类型成为 Copy ,值得注意的是,如果如果复制开销很大,也并适合进行这种隐式复制的。所以,对大型或复杂的数据结构,数据会被完整复制,导致性能问题。

例子:

#[derive(Clone, Copy)]
struct DemoStruct {
    field: i32,
}

fn main() {
    let original = DemoStruct { field: 32 };
    let copy = original; 

    println!("原始对象的 field: {}", original.field);
    println!("复制对象的 field: {}", copy.field);
}

在 main 函数中,创建了 DemoStruct 的一个实例 original,然后通过简单的赋值创建了一个名为 copy 的新实例。由于 DemoStruct 实现了 Copy 特质,original 会被自动复制给 copy,而不是移动(move)。

其他的:

  • Sized
  • Deref 与 DerekfMut
  • Default
  • AsRef和AsMut
  • Borrow 和 BorrowMut
  • From 和 Into
  • TryFrom 和 TryInto
  • ToOwned

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...