言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Rust辞典

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

struct / フィールド定義

対応: Rust 1.0(2015)

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 }残りのフィールドを別のインスタンスからコピーします(更新構文)。

サンプルコード

sample_struct_definition.rs
// 呪術師の情報を表す構造体です。
struct Sorcerer {
    name: String,
    email: String,
    grade: u32,
    active: bool,
}

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

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

fn main() {
    // インスタンスを生成します。
    let user1 = Sorcerer {
        name: String::from("五条悟"),
        email: String::from("gojo@jujutsu.ac.jp"),
        grade: 1,
        active: true,
    };

    println!("呪術師: {}", user1.name);
    println!("メール: {}", user1.email);
    println!("等級: {}", user1.grade);

    // mut でフィールドを変更します(構造体全体がmutになります)。
    let mut user2 = build_sorcerer(
        String::from("sukuna@jujutsu.ac.jp"),
        String::from("両面宿儺"),
    );
    user2.grade = 0;
    println!("両面宿儺 の等級更新後: {}", user2.grade);

    // 構造体の更新構文: 一部のフィールドだけ変えて新しいインスタンスを作ります。
    let user3 = Sorcerer {
        email: String::from("itadori@jujutsu.ac.jp"),
        name: String::from("虎杖悠仁"),
        ..user1  // 残りのフィールドをuser1からコピーします。
    };
    println!("user3 の grade: {}", user3.grade);    // 1(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);
}
rustc struct_definition.rs
./struct_definition
呪術師: 五条悟
メール: gojo@jujutsu.ac.jp
等級: 1
両面宿儺 の等級更新後: 0
user3 の grade: 1
user3 active: true
Point: (3, 4)
距離: 5.2 m
x=3, y=4

概要

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

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

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

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