Rust の借用
1. 借用と参照
所有権を移動(Move)させずに、値を利用したい場合があります。
Rustでは「参照(Reference)」を使用することでこれを実現でき、この仕組みを「借用(Borrowing)」と呼びます。
2. 参照(Reference)とは何か?
参照を使用すると、所有権を持つことなく値にアクセスできます。参照を作成するには、& 記号を使用します。
サンプルコード
let a = String::from("Hello");
let b = &a; // aへの参照を作成(借用)
println!("aの値 = {}", a); // aは依然として所有権を持っています
println!("bの値 = {}", b); // bはaの値を参照していますb は値を「借用」しているだけなので、a は依然として所有権を保持しています。
3. 可変参照 (Mutable References)
参照を介して値を「変更」したい場合は、参照を mut(ミュータブル)にする必要があります。
サンプルコード
let mut name = String::from("John");
let name_ref = &mut name; // 可変参照を作成
name_ref.push_str(" Doe");
println!("{}", name_ref); // 出力: John Doe注記: 特定の値に対して、一度に持てる「可変参照」は最大で1つだけです。これはデータ競合を防ぐためのRustの強力な安全ルールです。
4. なぜ借用が重要なのか
借用を利用することで、所有権を手放すことなく安全に値を再利用できます。
- 所有権の維持: 所有権を移動させずに値を使用できます。
- パフォーマンスの最適化: データの複製(クローン)を避けることができるため、大規模なデータ構造を扱う際に高速に動作します。
- メモリ安全性: Rustのコンパイラが借用のルールをチェックするため、プログラムがより安全かつ高速になります。
1つの値を複数の場所で読み取る(不変参照)のは自由ですが、書き換える(可変参照)場合は厳格に制限することで、予期せぬバグを未然に防ぐことができます。