🗒️

RustのCopy,Clone,Dropのメモ

2020/10/08に公開

この記事はQiita https://qiita.com/exy81/items/2a1d1f2aac2fa9be0fd7 から移行したものです。

Copyトレイト

変数への代入や関数の引数に渡したりするときに、明示しなくてもcloneが呼ばれるようになる。
基本型、基本型のみのタプルと構造体など、主にサイズが小さい構造体などに使う。

Cloneトレイトも同時に実装しなければならない。
メンバがすべてCopyでないといけない(基本型はすべてCopyを実装している)。
Dropトレイトとは競合する。
Dropトレイトに適合する型を持つ構造体にCopy注釈はつけられない。

Cloneトレイト

基本的にはdeep copyを実装する。
基本型についてはdeep copyとshallow copyに違いがないので、暗黙にcloneされる。

Dropトレイト

所有権を持つ変数がスコープから抜けるときにdropが実行される。
主にヒープに保持される型、もしくは、それらの型をメンバに含む場合に使用される。

Copyトレイトとは競合する。

関数に引数で渡したり、変数に代入した場合

  • Copyを実装している場合:複製が作られる(暗黙のうちにcloneされる)。
  • Copyでない場合:所有権が移動される。
    • 複製(deep copy)を作る場合は明示的にcloneを呼び出す。
    • ムーブでないshallow copyをしたければRcを使わなければならない。

Discussion