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:?}");
}
- 代入後は、
p1とp2の両方が独自のデータを所有します。 p1.clone()を使用してデータを明示的にコピーすることもできます。
This slide should take about 5 minutes.
コピーとクローン作成は同じではありません。
- コピーとは、メモリ領域のビット単位コピーのことであり、任意のオブジェクトでは機能しません。
- コピーではカスタムロジックは使用できません(C++ のコピーコンストラクタとは異なります)。
- クローン作成はより一般的なオペレーションであり、
Cloneトレイトを実装することでカスタム動作も可能になります。 Dropトレイトを実装している型では、コピーは出来ません。
上記の例で、次の方法を試してください。
Stringフィールドをstruct Pointに追加します。StringがCopy型ではないため、コンパイルできなくなります。derive属性からCopyを削除します。p1のprintln!でコンパイラ エラーが発生します。- 代わりに
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.