0Pricing
Learn Rust Coding · レッスン

構造体の定義と利用

タプル構造体やユニット風構造体を含む構造体でカスタムデータ構造を作成し、関連するデータをまとめる方法を学びます。

「構造体の定義と利用」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全3レッスンが含まれています。

構造体入門:カスタムデータ型

Rustの構造体(structureの略)は、複数の関連する値に名前を付け、意味のあるグループとしてまとめるカスタムデータ型を作成する仕組みです。

構造体は、ユーザーや色、空間上の点の設計図だと考えることができます。ユーザーの名前、メールアドレス、年齢を別々の変数にする代わりに、それらをすべて User 構造体にまとめられます。

これにより、データを論理的に整理でき、コードの読みやすさと保守性も向上します。

基本的な構造体の定義

最も一般的な構造体は通常の構造体です。データの各要素に名前を付けます。この要素をフィールドと呼びます。定義方法は次のとおりです。

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    // This code only defines the struct blueprint.
    // No actual user has been created yet!
    println!("Struct 'User' blueprint defined.");
}

構造体のインスタンスの作成

構造体を定義したら、具体的なインスタンスを作成できます。各インスタンスは、フィールドに固有の値を保持します。インスタンスを作成するには、各フィールドに具体的な値を指定します。

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };
    println!("User instance created!");
}

構造体フィールドへのアクセス

構造体のインスタンスからデータを取得するには、ドット記法を使います。インスタンス名、ドット(.)、フィールド名の順に記述します。

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };
    println!("User's username: {}", user1.username);
    println!("User's email: {}", user1.email);
}

構造体の可変性

通常の変数と同じように、mut キーワードを使って構造体のインスタンス全体を可変にできます。インスタンスが可変なら、すべてのフィールドを変更できます。

特定のフィールドだけを可変にすることはできません。可変性は構造体のインスタンス全体に適用されます。

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };
    
    println!("Old email: {}", user1.email);
    user1.email = String::from("new_alice@example.com");
    println!("New email: {}", user1.email);
}

タプル構造体:名前のないフィールド

タプル構造体は、タプルに似た見た目を持ちながら名前が付いている、もう1つの構造体形式です。タプルに固有の型名を付けたい一方で、個々のフィールドに名前を付ける必要がない場合に便利です。

たとえば、Color(i32, i32, i32) は3つの整数をまとめた名前付きタプルです。

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
    println!("Tuple structs 'Color' and 'Point' defined.");
}

タプル構造体の使用

タプル構造体のインスタンス作成方法は、通常のタプルと似ています。内部の値にアクセスするには、0 から始まるインデックスを使ったドット記法を使用します。

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);

    println!("Black color: R={}, G={}, B={}", black.0, black.1, black.2);
    println!("Origin point: X={}, Y={}, Z={}", origin.0, origin.1, origin.2);
}

ユニット風構造体:マーカー

フィールドをまったく持たない構造体も定義できます。これらはユニット型 () と似た動作をするため、ユニット風構造体と呼ばれます。

データ自体は重要ではなく、特定の型にあるtraitを実装することを示すマーカーとして、よく使用されます。

struct AlwaysTrue;

fn main() {
    let subject = AlwaysTrue;
    // Unit-like structs don't store data directly,
    // but they can be instantiated and used as types.
    println!("Unit-like struct 'AlwaysTrue' created.");
}

構造体更新構文

既存の構造体インスタンスをもとに新しいインスタンスを作成し、一部のフィールド値だけを変更したい場合、Rustでは便利な構造体更新構文(..)を使用できます。

この構文は、残りのフィールドを指定したインスタンスからムーブします。そのため、元のインスタンスに Copy を実装していないフィールドが含まれている場合、元のインスタンスは使用できなくなります。

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    let user2 = User {
        email: String::from("bob@example.com"),
        username: String::from("bob456"),
        ..user1 // Copy remaining fields from user1
    };

    println!("User 2 email: {}", user2.email);
    println!("User 2 active: {}", user2.active);
    // user1.username is now moved, so user1 can't be used here.
}

構造体クイズ

Rustの構造体についての理解度を確認しましょう。

まとめ:構造体の概要

Rustで構造体を定義し、使用する方法を学びました。

  • 通常の構造体は、名前付きフィールドをまとめてカスタムデータ型を作成します。
  • タプル構造体は名前付きタプルで、フィールド名が必須でない場合に便利です。
  • ユニット風構造体にはフィールドがなく、マーカーとして機能します。
  • 構造体のインスタンスを mut にすると、フィールドを変更できます。
  • .. 構文を使うと、既存のインスタンスから新しいインスタンスを作成できます。

構造体は、Rustプログラムで関連するデータを整理するための基本要素です。コードがより構造化され、読みやすくなります。

よくある質問

「構造体の定義と利用」レッスンは無料ですか?

はい。「構造体の定義と利用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全3レッスンが含まれています。

「構造体の定義と利用」で何を学びますか?

タプル構造体やユニット風構造体を含む構造体でカスタムデータ構造を作成し、関連するデータをまとめる方法を学びます。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「構造体の定義と利用」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造体の定義と利用
  2. カスタム型のための列挙型
  3. 強力なパターンマッチング
← Learn Rust Codingに戻る