Rust

【Rust】第4章第2回:構造体のメソッド定義と関連関数の実装

本記事では、Rustの構造体にメソッドを定義する方法と、関連関数の実装について詳しく解説します。構造体にロジックを組み込むことで、より整理されたコードを書けるようになります。

0. 記事の概要

この記事を読むメリット

  • Rustの構造体のメソッドの基本を理解: 関連関数の定義方法を学べます。
  • コードの再利用性向上: 構造体とメソッドを組み合わせて、オブジェクト指向的なプログラムを書けます。
  • Rustらしいプログラム設計: Rustの所有権システムに適応した設計手法を習得できます。

この記事で学べること

  • 構造体のメソッドの定義方法
  • 関連関数の作成と活用
  • 所有権とメソッドの関係

1. 構造体にメソッドを定義する

1.1 メソッドの基本構文

構造体のメソッドは、implブロック内で定義します。

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 10, height: 5 };
    println!("面積: {}", rect.area());
}

動作解説

構造体Rectangleareaメソッドを定義し、インスタンスのフィールドを利用して面積を計算しています。

2. 関連関数の定義

2.1 関連関数とは?

関連関数は、selfを取らない関数で、通常newメソッドなどのコンストラクタ的な関数として使われます。

impl Rectangle {
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }
    }
}

fn main() {
    let rect = Rectangle::new(20, 15);
    println!("幅: {}, 高さ: {}", rect.width, rect.height);
}

動作解説

関連関数newを定義することで、新しいインスタンスを作成する際に簡潔な記述が可能になります。

3. メソッドの可変参照

3.1 フィールドを変更するメソッド

構造体のフィールドを変更する場合は、&mut selfを使用します。

impl Rectangle {
    fn set_width(&mut self, width: u32) {
        self.width = width;
    }
}

fn main() {
    let mut rect = Rectangle::new(30, 20);
    rect.set_width(50);
    println!("新しい幅: {}", rect.width);
}

動作解説

可変参照を受け取ることで、インスタンスのフィールドを変更するメソッドを定義できます。

4. よくあるエラーと対処法

  • 「cannot borrow immutable struct as mutable」エラー: 可変参照を持たずにフィールドを変更しようとすると発生。
  • 「expected struct, found reference」エラー: メソッドのシグネチャが適切でない場合に発生。

5. まとめ

本記事では、Rustの構造体のメソッド定義と関連関数の実装について学びました。次回は、列挙型(Enum)の定義とパターンマッチングについて詳しく解説します。