Rust

【Rust】第4章第1回:構造体(Struct)の定義とインスタンス化

本記事では、Rustの構造体(Struct)の定義方法とインスタンス化の仕方について詳しく解説します。構造体を活用することで、データを整理し、より分かりやすく効率的なプログラムを作成できます。

0. 記事の概要

この記事を読むメリット

  • Rustの構造体の基本を理解: データの整理と管理が容易になります。
  • 可読性の向上: 構造体を使うことでコードの可読性が向上します。
  • プログラムの設計力向上: 構造体を適切に活用することで、より良いソフトウェア設計が可能になります。

この記事で学べること

  • Rustの構造体の基本構文
  • 構造体のインスタンス化とフィールドのアクセス方法
  • タプル構造体とユニット構造体の違い

1. 構造体(Struct)とは?

1.1 構造体の基本概念

構造体とは、複数の異なる型のデータを一つのまとまりとして扱うデータ構造です。Rustではstructキーワードを使用して定義します。

struct User {
    username: String,
    email: String,
    age: u32,
}

fn main() {
    let user1 = User {
        username: String::from("rustacean"),
        email: String::from("rustacean@example.com"),
        age: 30,
    };
    println!("Username: {}", user1.username);
}

動作解説

構造体Userを定義し、user1のインスタンスを作成しました。各フィールドのデータにアクセスするにはuser1.usernameのように記述します。

2. 構造体のインスタンス化

2.1 フィールドの変更

構造体のインスタンスのフィールドを変更するには、可変変数として定義する必要があります。

fn main() {
    let mut user = User {
        username: String::from("rustacean"),
        email: String::from("rustacean@example.com"),
        age: 30,
    };
    user.email = String::from("new_email@example.com");
    println!("Updated Email: {}", user.email);
}

動作解説

構造体のフィールドを変更するためには、インスタンスをmutとして定義する必要があります。

3. タプル構造体

3.1 タプル構造体の活用

タプル構造体は、名前付きのタプルのように動作し、フィールドにラベルをつける必要がありません。

struct Color(i32, i32, i32);

fn main() {
    let red = Color(255, 0, 0);
    println!("Red: {}, {}, {}", red.0, red.1, red.2);
}

動作解説

タプル構造体Colorは、フィールド名を持たずにインデックスで値を参照します。

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

  • 「missing field」エラー: 構造体のインスタンス化時に必須のフィールドを省略すると発生します。
  • 「cannot assign to immutable field」エラー: mutをつけずにフィールドを変更しようとすると発生します。

5. まとめ

本記事では、Rustの構造体の定義とインスタンス化について学びました。次回は、構造体のメソッド定義と関連関数の実装について詳しく解説します。