Rust

【Rust】第3章第4回:可変借用と不変借用の違いと注意点

本記事では、Rustの「可変借用(Mutable Borrow)」と「不変借用(Immutable Borrow)」の違いについて詳しく解説します。適切に借用を活用することで、安全かつ効率的なメモリ管理が可能になります。

0. 記事の概要

この記事を読むメリット

  • Rustの借用の基本を理解: 可変借用と不変借用の違いを学べます。
  • エラーを防ぐ: 借用ルールを理解することでコンパイルエラーを回避できます。
  • コードの安全性向上: 安全なメモリ管理を実現するための適切な借用方法を学べます。

この記事で学べること

  • 可変借用と不変借用の基本
  • 借用のルールと適用範囲
  • よくあるエラーと対処法

1. 借用とは?

1.1 借用の基本概念

Rustでは、変数の所有権を移動せずにデータを扱うために「借用(Borrowing)」を使用します。借用には「不変借用」と「可変借用」の2種類があります。

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. 不変借用(Immutable Borrow)

2.1 不変借用の基本

不変借用を使用すると、データを読み取ることができますが、変更はできません。

fn main() {
    let s = String::from("Rust");
    let r1 = &s;
    let r2 = &s;
    println!("{} and {}", r1, r2);
}

動作解説

複数の不変参照を持つことが可能であり、同時にデータを読み取ることができます。

3. 可変借用(Mutable Borrow)

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の可変借用と不変借用の違いと適切な使用方法について解説しました。次回は、所有権と借用を理解するための実践例について詳しく学びます。