Copy 型

言語としてのデフォルトはムーブセマンティクスですが、特定の型ではデフォルトでコピーが行われます。

fn main() {
    let x = 42;
    let y = x;
    println!("x: {x}"); // would not be accessible if not Copy
    println!("y: {y}");
}

これらの型は Copy トレイトを実装しているからです。

あなたが定義した独自の型のデフォルトをコピーセマンティクスにすることが出来ます。

#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);

fn main() {
    let p1 = Point(3, 4);
    let p2 = p1;
    println!("p1: {p1:?}");
    println!("p2: {p2:?}");
}
  • 代入後は、p1p2 の両方が独自のデータを所有します。
  • p1.clone() を使用してデータを明示的にコピーすることもできます。
This slide should take about 5 minutes.

コピーとクローン作成は同じではありません。

  • コピーとは、メモリ領域のビット単位コピーのことであり、任意のオブジェクトでは機能しません。
  • コピーではカスタムロジックは使用できません(C++ のコピーコンストラクタとは異なります)。
  • クローン作成はより一般的なオペレーションであり、Clone トレイトを実装することでカスタム動作も可能になります。
  • Drop トレイトを実装している型では、コピーは出来ません。

上記の例で、次の方法を試してください。

  • String フィールドをstruct Point に追加します。StringCopy 型ではないため、コンパイルできなくなります。
  • derive 属性から Copy を削除します。p1println! でコンパイラ エラーが発生します。
  • 代わりに p1 のクローンを作成すれば解決できることを示します。

その他

  • Shared references are Copy/Clone, mutable references are not. This is because Rust requires that mutable references be exclusive, so while it's valid to make a copy of a shared reference, creating a copy of a mutable reference would violate Rust's borrowing rules.