返回介绍

8.5 复制

发布于 2024-10-13 11:25:31 字数 1144 浏览 0 评论 0 收藏 0

实现 Copy 特征,以复制代替所有权转移。有些限制:总是按位(bit)进行,且不允许重新实现。

pub trait Copy: Clone { }

因为 CloneCopySuperTrait ,所以总是成对出现。

#[derive(Debug)]
struct Data {}

fn main() {
  let a = Data{};
  let b = a;     // move!!!

  println!("{:?}", a);
           ^ value borrowed here after move
}
#[derive(Debug, Clone, Copy)]
struct Data {}

fn main() {
  let a = Data{};
  let b = a;     // copy!!!

  println!("{:?}", a);
}

位复制有些问题,比如字符串(String),它分头部结构和堆上的字符数组两部分。如果只复制头,那么就可能造成堆内数组多次释放。为此,我们可以实现 Clone 特征,自定义克隆操作。

相比 Copy 的隐式行为, Clone 总是显式调用。

#[derive(Debug)]
struct Data {
  x: i32,
  y: i32,
}

// 必须实现,但不能覆盖默认行为。
// 通常直接写在 #[derive] 内。
impl Copy for Data {}

// 自定义克隆行为。
impl Clone for Data {
  fn clone(&self) -> Self {
    Self { x: self.x, y: 0 }
  }
}

/* -------------------------------- */

fn main() {
  let a = Data{x: 10, y: 20};
  let b = a.clone();

  assert_eq!(b.x, 10);
  assert_eq!(b.y, 0);

  assert_eq!(a.x, b.x);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文