Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

構造体

struct キーワードを使って作成できる構造体("structs")には、次の 3 種類があります。

  • タプル構造体。基本的には名前付きタプルです。
  • 従来の C の構造体
  • ユニット構造体。フィールドを持たず、ジェネリクスで有用です。
// 未使用コードの警告を非表示にする属性。
#![allow(dead_code)]

#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

// ユニット構造体
struct Unit;

// タプル構造体
struct Pair(i32, f32);

// 2 つのフィールドを持つ構造体
struct Point {
    x: f32,
    y: f32,
}

// 構造体は別の構造体のフィールドとして再利用できる
struct Rectangle {
    // 長方形は、空間内で左上と右下の角がどこにあるかによって
    // 指定できる。
    top_left: Point,
    bottom_right: Point,
}

fn main() {
    // フィールド初期化省略記法で構造体を作成する
    let name = String::from("Peter");
    let age = 27;
    let peter = Person { name, age };

    // デバッグ構造体を出力する
    println!("{:?}", peter);

    // `Point` をインスタンス化する
    let point: Point = Point { x: 5.2, y: 0.4 };
    let another_point: Point = Point { x: 10.3, y: 0.2 };

    // point のフィールドにアクセスする
    println!("point coordinates: ({}, {})", point.x, point.y);

    // 構造体更新構文を使って、もう一方のフィールドを利用しながら
    // 新しい点を作成する
    let bottom_right = Point { x: 10.3, ..another_point };

    // そのフィールドを `another_point` から使ったため、`bottom_right.y` は
    // `another_point.y` と同じになる
    println!("second point: ({}, {})", bottom_right.x, bottom_right.y);

    // `let` 束縛を使って point を分配束縛する
    let Point { x: left_edge, y: top_edge } = point;

    let _rectangle = Rectangle {
        // 構造体のインスタンス化も式である
        top_left: Point { x: left_edge, y: top_edge },
        bottom_right: bottom_right,
    };

    // ユニット構造体をインスタンス化する
    let _unit = Unit;

    // タプル構造体をインスタンス化する
    let pair = Pair(1, 0.1);

    // タプル構造体のフィールドにアクセスする
    println!("pair contains {:?} and {:?}", pair.0, pair.1);

    // タプル構造体を分配束縛する
    let Pair(integer, decimal) = pair;

    println!("pair contains {:?} and {:?}", integer, decimal);
}

アクティビティ

  1. Rectangle の面積を計算する関数 rect_area を追加してください(ネストした分配束縛を使ってみてください)。
  2. Pointf32 を引数に取り、その点を左上の角とし、幅と高さが その f32 に対応する Rectangle を返す関数 square を追加してください。

関連項目

attributesraw identifiers、および destructuring