文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.5 复制
实现 Copy
特征,以复制代替所有权转移。有些限制:总是按位(bit)进行,且不允许重新实现。
pub trait Copy: Clone { }
因为
Clone
是Copy
的SuperTrait
,所以总是成对出现。
#[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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论