Clone VS Copy


Copy 的全名是 std::marker::Copy。std::marker 这个模块里面的所有的 trait 都是特殊的 trait。目前稳定的有四个,它们是 Copy、Send、Sized、Sync,不能自己实现,没有方法 // 内部可变用 Rc,RefCell

一旦一个类型实现了 Copy trait,那么它在变量绑定、函数参数传递、函数返回值传递等场景下,它都是 copy 语义,而不再是默认的 move 语义。

只有所有的成员都实现了 Copy trait,这个类型才有资格实现 Copy trait,我们可以认为,Rust 中只有 POD(C++语言中的 Plain Old Data) 类型才有资格实现Copy trait

Clone 的全名是 std::clone::Clone,clone 方法自己实现,clone_from 默认实现,依赖 clone

clone 方法一般用于"基于语义的复制"操作。所以,它做什么事情,跟具体类型的作用息息相关。比如对于 Box 类型,clone 就是执行的"深拷贝",而对于 Rc 类型,clone 做的事情就是把引用计数值加1。

自动 derive:#[derive(Clone)]

String 这样的内部需要在堆上分布内存的数据结构,是没有实现Copy 的(因为内部是一个指针,所以,语义上是深拷贝,浅拷贝会招至各种bug和crash),需要复制的话,必需手动的调用其 clone() 方法