Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ムーブと初期化の追跡

借用チェッカーの仕事の一部は、任意の時点でどの変数が 「初期化済み」であるかを追跡することです。これには、 ムーブがどこで発生するかを特定し、それらを追跡することも必要です。

初期化とムーブ

ユーザーの視点からは、初期化――変数に何らかの値を与えること――と、 ムーブ――所有権を別の場所へ移すこと――は、別々のトピックに見えるかもしれません。 実際、借用チェッカーのエラーメッセージでは、それらについて異なる形で述べることがよくあります。 しかし、借用チェッカーの内部では、それらはそれほど別々のものではありません。 大まかに言えば、借用チェッカーはソースコード内の任意の時点で 「初期化済みのプレース」の集合を追跡します。以前は初期化されていなかったローカル変数に代入すると、 その変数がその集合に追加されます。ローカル変数からムーブすると、その変数はその集合から削除されます。

次の例を考えてみましょう。

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 残りはまだ書かれていません =)