複製
リソースについて対処する時、デフォルトで代入元や関数呼び出しによって 値が受け渡されます。しかし、ときどきレソースのコピーが作りたい場合が あります。
Cloneトレイトによって、これを正確に行なえます。一般的なもので
いうと、.clone()めそっどはCloneトレイトによって定義されています。
// リソースのない構造体 #[derive(Debug, Clone, Copy)] struct Unit; // `Clone`トレイトを持つタプル構造体 #[derive(Clone, Debug)] struct Pair(Box<i32>, Box<i32>); fn main() { // `Unit`をインスタンス化する let unit = Unit; // `Unit`をコピーする。ムーブするリソースが何もない。 let copied_unit = unit; // `Unit`は独立して使える。 println!("original: {:?}", unit); println!("copy: {:?}", copied_unit); // `Pair`をインスタンス化する。 let pair = Pair(Box::new(1), Box::new(2)); println!("original: {:?}", pair); // `pair`を`moved_pair`にコピーした時、リソースがムーブする。 let moved_pair = pair; println!("copy: {:?}", moved_pair); // エラー! `pair`はリソースを持っていません。 //println!("original: {:?}", pair); // TODO ^ この行をアンコメントしてみてください // `moved_pair`から`cloned_pair`に複製する(リソースも) let cloned_pair = moved_pair.clone(); // std::mem::dropでもとのリソースをdropする。 drop(moved_pair); // エラー! `moved_pair`はdropされています。 //println!("copy: {:?}", moved_pair); // TODO ^ この行をアンコメントしてみてください // .clone()の結果はまだ使えます! println!("clone: {:?}", cloned_pair); }