🗂

Rust 基本文法 - Struct 構造体-

2024/05/18に公開

はじめに

Struct は Rust における構造体を意味します。
基本文法シリーズは全てそうなのですが、構造体の文法はかなり基本的になるので、紹介していきます。

いつものように、Rust Playground で手を動かすことができますので、良ければ一緒に書いていきましょう。
https://play.rust-lang.org/

構造体

構造体は、データ型をまとめたものです。
Rust には データ型という概念があり、変数や関数などの要素にはデータ型というものがついてきます。
それらを一つに取りまとめたのが、構造体です。

データ型

試しに、Userという名前の構造体を定義します。
struct + 構造体名で表現することができ、その中にはkey:value形式で表現されます。

struct User {
    name: String,
    age: u32,
}

Userには nameageプロパティが存在します。
それぞれ、String型 、 u32型で表現します。

作成した構造体は、以下の例のように使用することができます。
nameageプロパティに対して、それぞれのデータ型に適した値を入れることができます。
user.まで入力すると、補完が効くのが良いですね。

struct User {
    name: String,
    age: u32,
}

fn main() {
    let user = User {
        name: "John".to_string(),
        age: 30,
    };

    println!("User name: {}", user.name);
    println!("User age: {}", user.age);
}

cargo runを実行します。

User name is John
User age is 30

当然ですが、プロパティのデータ型に対して、
一致しないデータ型の値を入れようとすると、コンパイルエラーとなります。

struct User {
    name: String,
    age: u32,
}

fn main() {
    let user = User {
        name: "John".to_string(),
        age: "30",
    };

    println!("User name: {}", user.name);
    println!("User age: {}", user.age);
}
mismatched types
expected `u32`, found `&str`

これにより、Userという概念を厳格に保つとこができ、
予期せぬ値が入ることがないように防ぐことができます。(コンパイラがチェックしてくれる!)

タプル構造体

これもよく使用するのですが、タプルの構造体を定義することも可能です。
先ほどの key:value形式の構造体ではなく、keyの部分を定義しない型で使用するシーンが多いです。

struct User(String, u32);

User()の中にはデータ型のみが定義されています。
これを main 関数内で呼び出してみると、以下のようになります。

struct User(String, u32);

fn main() {
    let user = User("John".to_string(), 30);
    println!("User name: {}", user.0);
    println!("User age: {}", user.1);
}

User()の中には先ほどと同様の値を入れています。
さらに、user.0user.1のようにインデックス番号を指定していることがわかります。
出力結果は先ほどと全く同じです。

User name: John
User age: 30

インデックス番号での呼び出し以外にも以下のような呼び出しも可能です。

struct User(String, u32);

fn main() {
    let User(name, age) = User("John".to_string(), 30);
    println!("User name: {}", name);
    println!("User age: {}", age);
}

let User()の中に変数名を入力することで、nameageに値を入れることができます。
(個人的にはこちらの呼び出し方の方が好みですかね。。)

おわりに

今回は Rust の構造体について触れてきました。
構造体テクニックを身につけることができれば、より厳格な型チェックができるようになりそうですね。

それでは!

コラボスタイル Developers

Discussion