【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());
}
動作解説
構造体Rectangle
にarea
メソッドを定義し、インスタンスのフィールドを利用して面積を計算しています。
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)の定義とパターンマッチングについて詳しく解説します。