《Rust 编程第一课》 学习笔记 day23

114 阅读2分钟

大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。第二十三天还是继续和大家一起学习 Rust😊

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

trait

常用的 trait

  • Clone / Copy trait ,约定数据被深拷贝或者浅拷贝的行为
  • Read / Write trait, 约定了对 I/O 读写的行为
  • Iterator,约定了迭代器的行为
  • Debug, 约定了数据如何被以 debug 的方式显示出来的行为
  • Default,约定数据类型的缺省值如何产生的行为
  • From / TryFrom,约定数据间如何转换的行为

内存相关的 trait

Clone trait

pub trait Clone {
	fn clone(&self) -> Self;

	fn clone_from(&mut self, source: &Self) { 
        *self = source.clone()
    }
}

Clone trait 有两个方法,clone_from 有缺省实现,所以只需要实现 clone() 方法就可以了

a.clone_from(&b) 在功能上等同于 a = b.clone(),但是如果 a 已经存在的话,使用 a.clone_from(&b) 就可以重用 a 的内存,避免重新进行内存分配,效率会高一些

如果类型中包含的其他类型都实现了Clone trait,就可以通过derive macro #[derive(Clone)]为类型自动实现Clone trait。 例如一个结构体的所有字段都实现了Clone trait,就可以使用#[derive(Clone)]

clone操作是深度拷贝,栈内存和堆内存将会被一起拷贝。因为是深度拷贝,因此这个拷贝操作耗费可能是昂贵的,也可能是廉价的。在Rust中的clone操作是显式的,需要显式调用。

clone 方法的接口是 &self,这在绝大多数场合下都是适用的,我们在 clone 一个数据时只需要有已有数据的只读引用。但对 Rc 这样在 clone() 时维护引用计数的数据结构,clone() 过程中会改变自己,所以要用 Cell 这样提供内部可变性的结构来进行改变

此文章为2月Day2学习笔记,内容来源于极客时间《Rust 编程第一课》