克隆
在处理资源时,默认行为是在赋值或函数调用期间转移它们。然而,有时我们也需要复制资源。
Clone
trait 帮助我们实现这一点。最常见的是,我们可以使用 Clone
trait 定义的 .clone()
方法。
// 一个不包含资源的单元结构体 #[derive(Debug, Clone, Copy)] struct Unit; // 一个包含资源并实现了 `Clone` trait 的元组结构体 #[derive(Clone, Debug)] struct Pair(Box<i32>, Box<i32>); fn main() { // 实例化 `Unit` let unit = Unit; // 复制 `Unit`,没有资源需要移动 let copied_unit = unit; // 两个 `Unit` 可以独立使用 println!("原始: {:?}", unit); println!("复制: {:?}", copied_unit); // 实例化 `Pair` let pair = Pair(Box::new(1), Box::new(2)); println!("原始: {:?}", pair); // 将 `pair` 移动到 `moved_pair`,资源也随之移动 let moved_pair = pair; println!("已移动: {:?}", moved_pair); // 错误!`pair` 已失去其资源 //println!("原始: {:?}", pair); // TODO ^ 尝试取消注释此行 // 将 `moved_pair` 克隆到 `cloned_pair`(包括资源) let cloned_pair = moved_pair.clone(); // 使用 std::mem::drop 丢弃已移动的原始对 drop(moved_pair); // 错误!`moved_pair` 已被丢弃 //println!("已移动并丢弃: {:?}", moved_pair); // TODO ^ 尝试取消注释此行 // .clone() 的结果仍然可以使用! println!("克隆: {:?}", cloned_pair); }