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
にコピーされています。Copyable
がcopyアビリティを持っていなければ、このコードはコンパイルされず、Moveコンパイラがエラーを発生させるでしょう。
copy
アビリティは、drop
アビリティと密接に関連しています。型がcopyアビリティを持っている場合、おそらくdrop
も持つべきです。これは、インスタンスが不要になったときにリソースをクリーンアップするためにdropアビリティが必要だからです。型がcopyのみを持っている場合、その値を無視できないため、インスタンスの管理がより複雑になります。
public struct Value has copy, drop {}
Moveのすべてのプリミティブ型は、copyとdropアビリティを持っているかのように振る舞います。これは、それらがコピーおよびドロップ可能であり、Moveコンパイラがそれらのメモリ管理を処理することを意味します。
Moveのすべてのネイティブ型はcopy
アビリティを持っています。これには以下が含まれます:
標準ライブラリで定義されているすべての型もcopy
アビリティを持っています。これには以下が含まれます: