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

借用

たいていの場合、データの所有権を取得せずにデータへアクセスしたいものです。 これを実現するために、Rust は_借用_メカニズムを使用します。 オブジェクトを値(T)で渡す代わりに、参照(&T)で渡すことができます。

コンパイラは(借用チェッカーを通じて)、参照が_常に_有効なオブジェクトを指していることを静的に保証します。 つまり、あるオブジェクトへの参照が存在している間、そのオブジェクトは破棄できません。

// この関数は box の所有権を取得して破棄する
fn eat_box_i32(boxed_i32: Box<i32>) {
    println!("{} を含む box を破棄しています", boxed_i32);
}

// この関数は i32 を借用する
fn borrow_i32(borrowed_i32: &i32) {
    println!("この整数は: {}", borrowed_i32);
}

fn main() {
    // ヒープ上に box 化された i32 を作成し、スタック上に i32 を作成する
    // 覚えておこう: 数値には可読性のために任意のアンダースコアを追加できる
    // 5_i32 は 5i32 と同じ
    let boxed_i32 = Box::new(5_i32);
    let stacked_i32 = 6_i32;

    // box の内容を借用する。所有権は取得されないため、
    // 内容は再び借用できる。
    borrow_i32(&boxed_i32);
    borrow_i32(&stacked_i32);

    {
        // box の内部に含まれるデータへの参照を取得する
        let _ref_to_i32: &i32 = &boxed_i32;

        // エラー!
        // 内部の値が後でスコープ内で借用される間は、`boxed_i32` を破棄できない。
        eat_box_i32(boxed_i32);
        // FIXME ^ この行をコメントアウトしてください

        // 内部の値が破棄された後に `_ref_to_i32` を借用しようとする
        borrow_i32(_ref_to_i32);
        // `_ref_to_i32` はスコープ外になり、もはや借用されていない。
    }

    // `boxed_i32` はここで `eat_box_i32` に所有権を譲渡し、破棄できる
    eat_box_i32(boxed_i32);
}