Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. struct / フィールド定義

struct / フィールド定義

Rustの構造体(struct)は複数の値をまとめたデータ型です。フィールドに名前を付ける通常の構造体、名前のないタプル構造体、フィールドのないユニット構造体の3種類があります。

構文
// 通常の構造体(フィールドに名前があります)。
struct Point {
    x: f64,
    y: f64,
}

// タプル構造体(フィールドに名前がありません)。
struct Color(u8, u8, u8);

// ユニット構造体(フィールドがありません)。
struct Marker;

// インスタンス生成です。
let p = Point { x: 1.0, y: 2.5 };
let c = Color(255, 128, 0);
let m = Marker;

// フィールドのアクセスです。
println!("{}", p.x);   // 1.0
println!("{}", c.0);   // 255(タプル構造体はインデックスでアクセス)
構造体の種類
種類概要
struct 名前 { フィールド: 型, ... }名前付きフィールドを持つ通常の構造体です。
struct 名前(型, 型, ...);名前なしフィールドのタプル構造体です。
struct 名前;フィールドなしのユニット構造体です(トレイトのマーカーなどに使います)。
let mut s = 構造体 { ... }mut を付けると全フィールドが変更可能になります。
フィールドショートハンド変数名とフィールド名が同じ場合は『{ x, y }』と省略できます。
struct 構造体2 { .., ..struct1 }残りのフィールドを別のインスタンスからコピーします(更新構文)。
サンプルコード
// ユーザー情報を表す構造体です。
struct User {
    username: String,
    email: String,
    age: u32,
    active: bool,
}

// タプル構造体の例です。
struct Point(f64, f64);
struct Meters(f64);

fn build_user(email: String, username: String) -> User {
    User {
        // フィールドショートハンド: 変数名とフィールド名が同じなので省略します。
        email,
        username,
        age: 20,
        active: true,
    }
}

fn main() {
    // インスタンスを生成します。
    let user1 = User {
        username: String::from("Alice"),
        email: String::from("alice@example.com"),
        age: 28,
        active: true,
    };

    println!("ユーザー: {}", user1.username);
    println!("メール: {}", user1.email);
    println!("年齢: {}", user1.age);

    // mut でフィールドを変更します(構造体全体がmutになります)。
    let mut user2 = build_user(
        String::from("bob@example.com"),
        String::from("Bob"),
    );
    user2.age = 30;
    println!("Bob の年齢更新後: {}", user2.age);

    // 構造体の更新構文: 一部のフィールドだけ変えて新しいインスタンスを作ります。
    let user3 = User {
        email: String::from("carol@example.com"),
        username: String::from("Carol"),
        ..user1  // 残りのフィールドをuser1からコピーします。
    };
    println!("user3 の age: {}", user3.age);    // 28(user1からコピー)
    println!("user3 active: {}", user3.active); // true

    // タプル構造体の使い方です。
    let p = Point(3.0, 4.0);
    let d = Meters(5.2);
    println!("Point: ({}, {})", p.0, p.1);
    println!("距離: {} m", d.0);

    // タプル構造体は分割代入も使えます。
    let Point(x, y) = p;
    println!("x={}, y={}", x, y);
}
概要

Rustの構造体はデフォルトでは『Debug』などのトレイトを実装していません。『println!("{:?}", s)』でデバッグ出力するには『#[derive(Debug)]』属性を追加する必要があります。

構造体の更新構文(『..other』)では、String型などのフィールドは所有権が移動します。移動後のインスタンスからそのフィールドにはアクセスできなくなります。

構造体へのメソッド追加は『impl / メソッド定義』を、自動トレイト実装は『#[derive(Debug, Clone, PartialEq)]』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。