copy:
CopyとCloneを stdlib側 で明示的 に定義 し、capability として再利用 できるようにします。- compiler
内部 の固定表 に頼 らず、.neplの trait宣言 と impl によって copy/clone を決定 する基盤 を提供 します。
- ここで
定義 するCopy/Cloneは「どういう値 を暗黙的 に複製 してよいか」を表 す capability です。 実装 する trait自体 は軽量 ですが、どの型 へ impl するかは所有権 と意味論 に強 く関係 します。
- trait
宣言 そのものは O(1) です。
Clone:
Clone::clone xの形 で、値 を明示的 に複製 できる能力 を表 します。
Cloneが独立 した複製 か、共有 を増 やす複製 かは、各 impl の意味 に従 います。利用者 は、型 ごとの注意 を確認 する必要 があります。
Copy:
Copyを持 つ型 が、move ではなく copy として扱 えることを示 します。
CopyはCloneより強 い制約 です。所有権 のある資源 を持 つ型 には impl しない前提 です。
bool は Clone / Copy の
i32 は Clone / Copy の
i64 は Clone / Copy の
i128 は Clone / Copy の
u128 は Clone / Copy の
u8 は Clone / Copy の
f32 は Clone / Copy の
f64 は Clone / Copy の
str は Clone / Copy の
目的
strは長 さつき文字列 view であり、所有権 を持 たないため、共有 view の複製 を capability として明示 します。
注意
複製 されるのは内容 そのものではなく、view としてのstrです。
unit は Clone / Copy の
目的
()は状態 を持 たないため、move ではなく copy として扱 ってよいことを明示 します。
MemPtr は Clone / Copy の
目的
MemPtr<.T>は所有権 を持 たない型付 きアドレス なので、move ではなく copy として扱 えることを明示 します。
注意
複製 されるのは領域 そのものではなく、参照先 を指 す軽量 ハンドルです。所有権 と解放責任 はRegionToken<.T>側 で管理 します。