2.2.2.7 Copy
07-Copy — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
2.2.2.7 Copy
类似 Clone,但表示类型可按位复制。
可派生:✅
| |
Clone表示显式的、用户定义的复制操作。Copy表示隐式的按位复制。一般只应在应表现得像原始值的“纯数据”类型上实现。例如线性代数库中的原始数值类型。
与
Clone有相同注意事项:若复制值会破坏不变量,该类型不应实现Copy。始终一起派生
Clone与Copy!实现Copy时不要手动实现Clone。
- 复制操作不会调用
clone方法,因此自定义Clone实现可能与隐式复制行为不同。一起派生Clone与Copy可确保调用clone与触发复制得到相同结果。不能在带有
Drop或非Copy字段的类型上实现。
问问学员:为何带有堆数据的类型(
Vec、BTreeMap、Rc等)不能是Copy?对这些类型按位复制,意味着带有堆数据的类型不再对指针拥有独占所有权,破坏 Rust 及其生态通常维护的不变量。
多个
Vec会指向同一块内存中的数据。增删数据只会更新各自Vec的长度与容量。BTreeMap同理。对
Rc按位复制不会更新指针内的引用计数值,意味着可能有两个Rc实例都认为自己是该指针唯一的Rc。其中一个被销毁后,其中一个的引用计数会变为 0,内部值被 drop,尽管仍有另一个Rc存活。