参照と借用を理解する
所有権を取得せずにコードの複数の部分から安全にデータへアクセスできる、参照と借用について学びます。
「参照と借用を理解する」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全3レッスンが含まれています。
参照とは
Rustでは、変数がデータを所有します。しかし、所有権を取得せずに、コードの別の部分からそのデータを参照したり変更したりするにはどうすればよいでしょうか。
そこで参照を使います。参照は値へのポインターのようなものですが、Rustコンパイラーによって厳格な規則が適用されます。
対象そのものを所有するのではなく、窓越しに見るようなものだと考えてください。
最初の参照
&演算子を使って参照を作成します。これにより、値への非所有ポインターが作成されます。実際に確認してみましょう。
fn print_length(s: &String) {
println!("The length is: {}", s.len());
}
fn main() {
let message = String::from("Hello, CoddyKit!");
print_length(&message); // Pass a reference
println!("Original message still here: {}", message);
}借用を理解する
値への参照を作成すると、その値を借用したことになります。所有者は引き続きその値を所有しますが、一時的にアクセスできるようになります。
- 譲渡せずに借りる:借用したデータを使用できます。
- 所有権は移動しない:元の変数が引き続きデータを所有し、スコープを外れるとそのデータを破棄します。
- 安全性を優先:Rustの借用規則により、データ競合などのよくあるプログラミングエラーを防げます。
不変借用:読み取り専用アクセス
Rustの参照はデフォルトで不変です。つまり、参照先のデータを読み取ることはできますが、変更はできません。
これは重要な安全機能です。コードの複数の部分が読み取り専用でアクセスしている場合、それぞれのデータに誤って干渉することはありません。
不変借用を実際に使う
ここでは、calculate_sum関数がベクターへの不変参照を受け取ります。要素を読み取ることはできますが、追加や削除はできません。
fn calculate_sum(numbers: &Vec<i32>) -> i32 {
let mut total = 0;
for num in numbers {
total += num;
}
total
}
fn main() {
let my_numbers = vec![10, 20, 30, 40];
let sum = calculate_sum(&my_numbers); // Immutable borrow
println!("The sum is: {}", sum);
println!("Original vector: {:?}", my_numbers);
}可変借用:データの変更
借用したデータを変更する必要がある場合があります。そのときは、可変参照を使用します。可変参照は &mut で表します。
可変参照には重要なルールがあります。特定のデータに対して同時に持てる可変参照は1つだけです。これによりデータ競合を防ぎ、安全性を確保できます。
&mut によるデータの変更
add_suffix 関数は String への可変参照を受け取ります。そのため、元の String を直接変更できます。
fn add_suffix(text: &mut String) {
text.push_str(" (modified)");
}
fn main() {
let mut my_string = String::from("Original text");
add_suffix(&mut my_string); // Mutable borrow
println!("Modified string: {}", my_string);
}借用の黄金律
Rustのコンパイラは、メモリ安全性を保証するため、コンパイル時に次のルールを適用します。
- 1つのデータに対して、同時に持てる可変参照は1つです。
- または、同時に不変参照をいくつでも持てます。
- 有効な不変参照が存在する間は、可変参照を持てません。
- 参照は常に有効でなければなりません(参照先のデータより長く存続することはできません)。
これらのルールにより、データ競合を防ぎ、安全で予測可能なプログラムを実現できます。
競合する借用
このコードは、my_value に対して不変参照と可変参照の両方を同時に作成しようとしています。これはRustの借用ルールに違反するため、コンパイルできません。
実行して、コンパイラのエラーを確認してみましょう。
fn main() {
let mut my_value = 100;
let r1 = &my_value; // Immutable reference
let r2 = &mut my_value; // Mutable reference (problem here!)
println!("r1: {}", r1);
// println!("r2: {}", r2); // This line would also cause an error if uncommented
}理解度を確認しましょう
次のRustコードを考えてみましょう。
fn process_data(data: &mut Vec<i32>) {
data.push(4);
}
fn main() {
let mut numbers = vec![1, 2, 3];
let first_ref = &numbers[0]; // Line A
process_data(&mut numbers); // Line B
println!("First element: {}", first_ref); // Line C
}Rustの借用ルールにより、どの行でコンパイル時エラーが発生するでしょうか。
まとめ:参照と借用
よくできました。Rustの参照と借用の基本を学びました。
- 参照(
&)を使うと、所有権を取得せずにデータへアクセスできます。 - 借用とは、参照を作成してデータへのアクセスを一時的に貸し出すことです。
- 不変参照(
&)では、読み取り専用でアクセスできます。 - 可変参照(
&mut)では、読み取りと書き込みができます。 - Rustの厳格な借用ルール(可変参照は1つ、または不変参照は複数)により、データ競合を防ぎ、コンパイル時にメモリ安全性を確保します。
これらの概念は、安全で効率的なRustコードを書くうえで欠かせません。
よくある質問
「参照と借用を理解する」レッスンは無料ですか?
はい。「参照と借用を理解する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全3レッスンが含まれています。
「参照と借用を理解する」で何を学びますか?
所有権を取得せずにコードの複数の部分から安全にデータへアクセスできる、参照と借用について学びます。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「参照と借用を理解する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Rustの所有権モデルを理解する
- 参照と借用を理解する
- 安全な参照のためのライフタイム