名前付きフィールドを持つ構造体

C や C++ と同様に、Rust は独自の構造体をサポートしています:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

struct Person {
    name: String,
    age: u8,
}

fn describe(person: &Person) {
    println!("{} is {} years old", person.name, person.age);
}

fn main() {
    let mut peter = Person {
        name: String::from("Peter"),
        age: 27,
    };
    describe(&peter);

    peter.age = 28;
    describe(&peter);

    let name = String::from("Avery");
    let age = 39;
    let avery = Person { name, age };
    describe(&avery);
}

重要なポイント:

  • 構造体は C や C++ のように機能します。
    • C++ と同様で、C とは異なり、型を定義するために typedef は不要です。
    • C++ とは異なり、構造体同士に継承はありません。
  • ここで、構造体にはいくつかの種類があることを説明するのもよいでしょう。
    • ゼロサイズ構造体(例: struct Foo;)は、ある型に対してトレイトを実装する際に、値自体に格納したいデータがない場合に使われることがあります。
    • 次のスライドでは、フィールド名が重要でない場合に使われるタプル構造体を紹介します。
  • すでに適切な名前の変数がある場合は、省略記法を使って構造体を作成できます。
  • 構造体のフィールドはデフォルト値をサポートしていません。デフォルト値は Default トレイトを実装することで指定します。これについては後で扱います。

さらに詳しく

  • ここでは、構造体更新構文も実演できます:

    // Copyright 2023 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    let jackie = Person { name: String::from("Jackie"), ..avery };
  • これにより、古い構造体から大部分のフィールドを、すべてを明示的に書き出さずにコピーできます。これは常に最後の要素でなければなりません。

  • これは主に Default トレイトと組み合わせて使われます。構造体更新構文については Default トレイトのスライドでより詳しく説明するので、受講者から質問がない限り、ここでは触れなくてもかまいません。