Dev Study
← 解説「所有権 — 値はムーブする」に戻る

サンプルコードで身につける: 所有権 — 値はムーブする

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

1代入で所有権が移る

String を別の変数に代入すると所有権がムーブし、元の変数が使えなくなる、という所有権の最小の例です。コメントを外すと「value borrowed here after move」というエラーになります。「代入はコピーではなく持ち主の交代」という Rust の世界観をまずこの2行で押さえてください。

Rust

2関数に渡すと所有権も渡る

String を引数として関数に渡すと、代入と同じようにムーブが起きることを示す例です。関数が終わった時点で message は解放されるため、呼び出し側の greeting はもう使えません。「関数呼び出しのたびに値が使えなくなって困る」という体験が、次の参照のレッスンの動機になります。

Rust

3戻り値で所有権を返してもらう

関数は String を作って所有権ごと返すことも、受け取った所有権を加工して返すこともできる、という例です。add_suffix は title を引数でもらい、連結した新しい String の所有権を返しています。「渡して、加工結果を受け取り直す」というキャッチボールが、参照を学ぶ前の所有権スタイルの基本形です。

Rust

4+ による連結も左辺をムーブする

String にリテラルを + で連結すると、左辺の base がムーブされて結果の一部になることを示す例です。連結後に base を使おうとするとコンパイルエラーになります。ログやメッセージの組み立てで自然に書く + の裏でも所有権が動いている、と分かるとエラーメッセージに驚かなくなります。

Rust

5ループで進捗バーを組み立てる

ループの中で「古い String をムーブして連結し、新しい String を同じ変数に入れ直す」を繰り返して文字列を組み立てる実務寄りの例です。bar = bar + "■" の1行に、ムーブと再束縛が同居しています。完成品の所有権を return ではなく最後の式で呼び出し元へ返すところまで、所有権の流れを通しで追ってみてください。

Rust