ムーブと初期化の追跡
借用チェッカーの仕事の一部は、任意の時点でどの変数が 「初期化済み」であるかを追跡することです。これには、 ムーブがどこで発生するかを特定し、それらを追跡することも必要です。
初期化とムーブ
ユーザーの視点からは、初期化――変数に何らかの値を与えること――と、 ムーブ――所有権を別の場所へ移すこと――は、別々のトピックに見えるかもしれません。 実際、借用チェッカーのエラーメッセージでは、それらについて異なる形で述べることがよくあります。 しかし、借用チェッカーの内部では、それらはそれほど別々のものではありません。 大まかに言えば、借用チェッカーはソースコード内の任意の時点で 「初期化済みのプレース」の集合を追跡します。以前は初期化されていなかったローカル変数に代入すると、 その変数がその集合に追加されます。ローカル変数からムーブすると、その変数はその集合から削除されます。
次の例を考えてみましょう。
fn foo() {
let a: Vec<u32>;
// a はまだ初期化されていない
a = vec![22];
// a はここで初期化されている
std::mem::drop(a); // a はここでムーブされる
// a はここではもはや初期化されていない
let l = a.len(); //~ ERROR
}
ここでは、a が最初は未初期化であることがわかります。
代入されると、a は初期化済みになります。しかし drop(a) が呼び出されると、
それによって a が呼び出しの中へムーブされるため、再び未初期化になります。
サブセクション
読みやすくするため、このセクションはいくつかのサブセクションに分かれています。
- ムーブパス: どのローカル変数(場合によってはローカル変数の一部)が 初期化済みかを追跡するために使用する ムーブパス の概念。
- TODO 残りはまだ書かれていません =)