所有権 (Ownership)
別名: ownership / 借用 / borrowing / 借用チェッカー / borrow checker
Rust がメモリを管理するための規則。
値には所有者が 1 つだけあり、所有者がスコープを抜けると値は破棄される。
参照で一時的に借りる「借用」の規則と合わせて、コンパイル時に検査される。
公開:
定義
所有権(ownership)は、Rust がガベージコレクションを使わずにメモリを管理するための規則である。
値にはそれぞれ所有者が 1 つだけあり、所有者がスコープを抜けると値は破棄(drop)される。
規則はコンパイラが検査し、違反するとビルドが通らない。
その代わり、実行時の速度には影響しない。
詳細
String のような値を別の変数に代入したり関数に渡したりすると、所有権が移る(ムーブ)。
移した後の元の変数は使えない。
整数や bool のように Copy トレイトを実装した型は、ムーブせず複製される。
所有権を移さずに値を使うには参照(& / &mut)を作る。
これを借用と呼び、「同時に持てるのは可変参照 1 つか、不変参照いくつでも」「参照は常に有効でなければならない」という規則を借用チェッカーが検査する。
違反すると E0382(ムーブ後の使用)や E0499(可変参照の重複)が出る。
よくある誤解
clone()すれば解決するとは限らない。
コンパイルは通るが、ヒープ上のデータまで丸ごと複製するのでコストがかかる。
読むだけなら参照を渡せば足りる(Rust で「borrow of moved value」(E0382) が解決できない)。- ライフタイム注釈で値の寿命は延ばせない。
注釈は複数の参照の有効期間どうしの関係を書くだけで、どの参照の寿命も変えない(Rust で「missing lifetime specifier」が解消できない)。
関連
関数が参照を返すときは、どの引数から借りたかをライフタイムで示す。
省略規則に当てはまる場合は書かなくてよい。Rc や RefCell は、所有者を複数にしたり借用の検査を実行時に回したりして、この規則の制約を緩めるための型である。