跳到主要内容

clone

处理资源时,默认行为是在赋值或函数调用期间传输它们。但是,有时我们也需要复制资源。

Clone 特性可以帮助我们做到这一点。最常见的是,我们可以使用 Clone 特征定义的 .clone() 方法。

// A unit struct without resources
#[derive(Debug, Clone, Copy)]
struct Unit;

// A tuple struct with resources that implements the `Clone` trait
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
// Instantiate `Unit`
let unit = Unit;
// Copy `Unit`, there are no resources to move
let copied_unit = unit;

// Both `Unit`s can be used independently
println!("original: {:?}", unit);
println!("copy: {:?}", copied_unit);

// Instantiate `Pair`
let pair = Pair(Box::new(1), Box::new(2));
println!("original: {:?}", pair);

// Move `pair` into `moved_pair`, moves resources
let moved_pair = pair;
println!("moved: {:?}", moved_pair);

// Error! `pair` has lost its resources
//println!("original: {:?}", pair);
// TODO ^ Try uncommenting this line

// Clone `moved_pair` into `cloned_pair` (resources are included)
let cloned_pair = moved_pair.clone();
// Drop the moved original pair using std::mem::drop
drop(moved_pair);

// Error! `moved_pair` has been dropped
//println!("moved and dropped: {:?}", moved_pair);
// TODO ^ Try uncommenting this line

// The result from .clone() can still be used!
println!("clone: {:?}", cloned_pair);
}
Loading Comments...