When dealing with resources, the default behavior is to transfer them during
assignments or function calls. Sometimes the intention is to make a copy of the
resource, this can be accomplished by calling the clone method, defined in
the Clone trait.
// A unit struct without resources
#[deriving(Show, Copy)]
struct Nil;
// A tuple struct with resources that implements the `Clone` trait
#[deriving(Clone,Show)]
struct Pair(Box<int>, Box<int>);
fn main() {
// Instantiate `Nil`
let nil = Nil;
// Copy `Nil`, there are no resources to move
let copied_nil = nil;
// Both `Nil`s can be used independently
println!("original: {}", nil);
println!("copy: {}", copied_nil);
// Instantiate a `Pair`
let pair = Pair(box 1, box 2);
println!("original: {}", pair);
// Copy `pair` into `moved_pair`, moves resources
let moved_pair = pair;
println!("copy: {}", moved_pair);
// Error! `pair` has lost it resources
//println!("original: {}", pair);
// TODO ^ Try uncommenting this line
// "Clone" `moved_pair` into `cloned_pair` (resources included)
let cloned_pair = moved_pair.clone();
// `Drop` the original pair
drop(moved_pair);
// Error! `moved_pair` has been `drop`ed
//println!("copy: {}", moved_pair);
// TODO ^ Try uncommenting this line
// Clone can still be used
println!("clone: {}", cloned_pair);
}