できない.dev

所有権 (Ownership)

別名: ownership / 借用 / borrowing / 借用チェッカー / borrow checker

Rust がメモリを管理するための規則。
値には所有者が 1 つだけあり、所有者がスコープを抜けると値は破棄される。
参照で一時的に借りる「借用」の規則と合わせて、コンパイル時に検査される。

公開:

定義

所有権(ownership)は、Rust がガベージコレクションを使わずにメモリを管理するための規則である。
値にはそれぞれ所有者が 1 つだけあり、所有者がスコープを抜けると値は破棄(drop)される。
規則はコンパイラが検査し、違反するとビルドが通らない。
その代わり、実行時の速度には影響しない。

詳細

String のような値を別の変数に代入したり関数に渡したりすると、所有権が移る(ムーブ)。
移した後の元の変数は使えない。
整数や bool のように Copy トレイトを実装した型は、ムーブせず複製される。
所有権を移さずに値を使うには参照(& / &mut)を作る。
これを借用と呼び、「同時に持てるのは可変参照 1 つか、不変参照いくつでも」「参照は常に有効でなければならない」という規則を借用チェッカーが検査する。
違反すると E0382(ムーブ後の使用)や E0499(可変参照の重複)が出る。

よくある誤解

関連

関数が参照を返すときは、どの引数から借りたかをライフタイムで示す。
省略規則に当てはまる場合は書かなくてよい。Rc や RefCell は、所有者を複数にしたり借用の検査を実行時に回したりして、この規則の制約を緩めるための型である。