【Rust】第3章第2回:借用(Borrowing)と参照:所有権を共有する方法

本記事では、Rustの所有権システムにおける「借用(Borrowing)」と「参照」の仕組みについて詳しく解説します。所有権を移動せずにデータを扱う方法を学び、効率的なメモリ管理を理解しましょう。
0. 記事の概要
この記事を読むメリット
- Rustの借用の基本を理解: 所有権を移動せずに変数を扱う方法を学べます。
- コードの安全性向上: 不要な所有権の移動を防ぎ、メモリ管理を最適化できます。
- よくあるエラーを回避: 借用に関するエラーの原因と対処法を理解できます。
この記事で学べること
- 借用(Borrowing)と参照の基本概念
- 不変参照と可変参照の違い
- 借用ルールとその活用方法
1. 借用(Borrowing)とは?

1.1 借用の基本概念
Rustでは、変数の所有権を移動せずに利用するために「借用(Borrowing)」を使います。
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
型の参照を受け取り、所有権を変更せずにデータを利用します。
2. 不変参照と可変参照

2.1 不変参照(Immutable Reference)
不変参照を使用すると、所有権を持たないままデータを読み取ることができます。
fn main() {
let s = String::from("Rust");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
}
動作解説
複数の不変参照が可能であり、同時にデータを読み取ることができます。
3. 可変参照(Mutable Reference)

3.1 可変参照の基本
可変参照を使うことで、所有権を持たずにデータを変更できます。
fn main() {
let mut s = String::from("Hello");
let r = &mut s;
r.push_str(", Rust!");
println!("{}", r);
}
動作解説
可変参照を利用すると、所有権を移動せずにデータの変更が可能です。ただし、同時に複数の可変参照を持つことはできません。
4. 借用に関するルール
- 不変参照と可変参照を同時に持つことはできない。
- 同じ変数に対して複数の可変参照を持つことはできない。
- 借用が有効な間、元の変数の所有権は一時的に使用できない。
5. よくあるエラーと対処法
- 「cannot borrow as mutable because it is also borrowed as immutable」エラー: 不変参照と可変参照を同時に使用しようとすると発生。
- 「cannot borrow as mutable more than once」エラー: 複数の可変参照を持とうとすると発生。
6. まとめ
本記事では、Rustの借用と参照について詳しく解説しました。次回は、ライフタイム(Lifetime)の基本と注釈の使い方について学びます。