Clone

当处理资源时,默认的行为是在赋值或函数调用的同时将它们转移。但是我们有时候也需要 把资源复制一份。

Clone trait 正好帮助我们完成这任务。通常,我们可以使用由 Clone trait 定义的 .clone() 方法。

  1. // 不含资源的单元结构体
  2. #[derive(Debug, Clone, Copy)]
  3. struct Nil;
  4. // 一个包含资源的结构体,它实现了 `Clone` trait
  5. #[derive(Clone, Debug)]
  6. struct Pair(Box<i32>, Box<i32>);
  7. fn main() {
  8. // 实例化 `Nil`
  9. let nil = Nil;
  10. // 复制 `Nil`,没有资源用于移动(move)
  11. let copied_nil = nil;
  12. // 两个 `Nil` 都可以独立使用
  13. println!("original: {:?}", nil);
  14. println!("copy: {:?}", copied_nil);
  15. // 实例化 `Pair`
  16. let pair = Pair(Box::new(1), Box::new(2));
  17. println!("original: {:?}", pair);
  18. // 将 `pair` 绑定到 `moved_pair`,移动(move)了资源
  19. let moved_pair = pair;
  20. println!("copy: {:?}", moved_pair);
  21. // 报错!`pair` 已失去了它的资源。
  22. //println!("original: {:?}", pair);
  23. // 试一试 ^ 取消此行注释。
  24. // 将 `moved_pair`(包括其资源)克隆到 `cloned_pair`。
  25. let cloned_pair = moved_pair.clone();
  26. // 使用 std::mem::drop 来销毁原始的 pair。
  27. drop(moved_pair);
  28. // 报错!`moved_pair` 已被销毁。
  29. //println!("copy: {:?}", moved_pair);
  30. // 试一试 ^ 将此行注释掉。
  31. // 由 .clone() 得来的结果仍然可用!
  32. println!("clone: {:?}", cloned_pair);
  33. }