借用
たいていの場合、データの所有権を取得せずにデータへアクセスしたいものです。 これを実現するために、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); }