Dev Study
← 解説「Copy と Clone — ムーブしない型・明示的な複製」に戻る

サンプルコードで身につける: Copy と Clone — ムーブしない型・明示的な複製

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1i32 は Copy — 代入してもムーブしない

整数の代入では値が複製され、代入後も両方の変数が使える、という Copy の最小の例です。前のレッスンの String とまったく同じ形のコードなのに、こちらはエラーになりません。「単純な型は複製、ヒープを使う型はムーブ」という対比の起点になる例です。

Rust

2f64 や bool、char も Copy

Copy なのは i32 だけではなく、f64・bool・char といった固定サイズの単純な型はすべて代入で複製される、と確かめる例です。これらはスタックに収まる小さなデータなので、複製してもコストがほぼかかりません。「数値や真偽値の代入でムーブを心配する必要はない」と整理できます。

Rust

3String は .clone() で明示的に複製する

Copy でない String も、.clone() を呼べばヒープの中身ごと複製でき、元の変数も複製も両方使える、という例です。ムーブの例と見比べると、違いは .clone() の一呼び出しだけです。複製のコストがコード上に必ず残るので、あとから読む人が「ここでコピーが起きる」と気づけます。

Rust

4関数に渡すときの Copy と clone の違い

i32 を関数に渡しても手元の値はそのまま使えるのに対し、String はムーブされるので clone を渡して原本を残す、という対比の例です。「渡したあとも使いたいか」を考えてから渡し方を選ぶのが所有権との付き合い方です。次のレッスンで学ぶ参照を使えば、clone すら不要になります。

Rust

5原本を残して加工版を作る

通知メッセージの原本を clone してから加工関数に渡し、原本と加工後の両方を保持する実務寄りの例です。テンプレートから複数のバリエーションを作る、変更前のデータを監査用に残す、といった場面でこのパターンを使います。「とりあえず clone」で先へ進み、あとで参照に直して最適化する、という進め方も実務ではよく取られます。

Rust