【Rust】第3章第5回:所有権と借用を理解するための実践例

本記事では、Rustの所有権(Ownership)と借用(Borrowing)を実践的なコード例とともに解説します。実際の使用シナリオを通じて、より深い理解を得ましょう。
0. 記事の概要
この記事を読むメリット
- Rustの所有権と借用を実践的に理解: 具体的なコード例を通して学べます。
- エラーを防ぐ: よくある所有権や借用のエラーを回避する方法を学べます。
- 安全なメモリ管理: 所有権のルールを守りながら効率的なプログラムを作成できます。
この記事で学べること
- 所有権と借用の適用例
- 可変借用と不変借用の組み合わせ
- 実際のコードでのエラーハンドリング
1. 所有権と借用の基本

1.1 所有権の適用例
所有権の基本を理解するために、変数の所有権が移動する例を見てみましょう。
fn main() {
let s1 = String::from("Rust");
let s2 = s1; // s1の所有権がs2に移動
// println!("{}", s1); // ここでエラー!s1は無効
println!("{}", s2); // s2は有効
}
動作解説
変数s1
の所有権がs2
に移動したため、s1
は使用できません。
2. 借用の適用例

2.1 不変借用の活用
所有権を移動せずにデータを使用するには、不変借用を利用します。
fn print_length(s: &String) {
println!("文字列の長さ: {}", s.len());
}
fn main() {
let text = String::from("Hello, Rust!");
print_length(&text);
println!("元の文字列: {}", text); // textは依然として有効
}
動作解説
関数print_length
は&String
型の参照を受け取り、所有権を変更せずにデータを利用します。
3. 可変借用と所有権
3.1 可変借用の活用
可変借用を使うことで、所有権を持たずにデータを変更できます。
fn modify(s: &mut String) {
s.push_str(", Rust!");
}
fn main() {
let mut text = String::from("Hello");
modify(&mut text);
println!("{}", text);
}
動作解説
可変参照を利用すると、所有権を移動せずにデータの変更が可能です。ただし、同時に複数の可変参照を持つことはできません。
4. 所有権と借用のエラーハンドリング

4.1 よくあるエラーとその対処法
- 「value borrowed here after move」エラー: ムーブ後に元の変数を使用しようとすると発生。
- 「cannot borrow as mutable because it is also borrowed as immutable」エラー: 不変参照と可変参照を同時に使用しようとすると発生。
5. まとめ
本記事では、Rustの所有権と借用の実践例について詳しく解説しました。次回は、構造体(Struct)の定義とインスタンス化について学びます。