Moveでは、型に対するcopyアビリティは、その型のインスタンスまたは値がコピー可能であることを示します。この動作は、数値や他の単純な型を扱う際には非常に自然に感じられるかもしれませんが、Moveではカスタム型のデフォルトではありません。これは、Moveがデジタル資産やリソースを表現するように設計されており、コピー不可能性がリソースモデルの重要な要素だからです。

しかし、Move型システムでは、copyアビリティを持つカスタム型を定義することができます。

public struct Copyable has copy {}

上の例では、copyアビリティを持つカスタム型Copyableを定義しています。これは、Copyableのインスタンスが暗黙的にも明示的にもコピー可能であることを意味します。

let a = Copyable {};
let b = a;   // `a`が`b`にコピーされる
let c = *&b; // 参照外し演算子による明示的なコピー

let Copyable {} = a; // `drop`を持っていない
let Copyable {} = b; // `drop`を持っていない
let Copyable {} = c; // `drop`を持っていない

上の例では、aが暗黙的にbにコピーされ、その後、参照外し演算子を使用して明示的にcにコピーされています。Copyablecopyアビリティを持っていなければ、このコードはコンパイルされず、Moveコンパイラがエラーを発生させるでしょう。

コピーとドロップ

copyアビリティは、dropアビリティと密接に関連しています。型がcopyアビリティを持っている場合、おそらくdropも持つべきです。これは、インスタンスが不要になったときにリソースをクリーンアップするためにdropアビリティが必要だからです。型がcopyのみを持っている場合、その値を無視できないため、インスタンスの管理がより複雑になります。

public struct Value has copy, drop {}

Moveのすべてのプリミティブ型は、copydropアビリティを持っているかのように振る舞います。これは、それらがコピーおよびドロップ可能であり、Moveコンパイラがそれらのメモリ管理を処理することを意味します。

copyアビリティを持つ型

Moveのすべてのネイティブ型はcopyアビリティを持っています。これには以下が含まれます:

標準ライブラリで定義されているすべての型もcopyアビリティを持っています。これには以下が含まれます: