Rust

【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)の定義とインスタンス化について学びます。