Rust

【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)の基本と注釈の使い方について学びます。