Rust 基本文法 - Struct 構造体-
はじめに
Struct は Rust における構造体を意味します。
基本文法シリーズは全てそうなのですが、構造体の文法はかなり基本的になるので、紹介していきます。
いつものように、Rust Playground で手を動かすことができますので、良ければ一緒に書いていきましょう。
構造体
構造体は、データ型をまとめたものです。
Rust には データ型という概念があり、変数や関数などの要素にはデータ型というものがついてきます。
それらを一つに取りまとめたのが、構造体です。
データ型
試しに、User
という名前の構造体を定義します。
struct
+ 構造体名で表現することができ、その中にはkey:value
形式で表現されます。
struct User {
name: String,
age: u32,
}
User
には name
やage
プロパティが存在します。
それぞれ、String
型 、 u32
型で表現します。
作成した構造体は、以下の例のように使用することができます。
name
、age
プロパティに対して、それぞれのデータ型に適した値を入れることができます。
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.0
、user.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()
の中に変数名を入力することで、name
やage
に値を入れることができます。
(個人的にはこちらの呼び出し方の方が好みですかね。。)
おわりに
今回は Rust の構造体について触れてきました。
構造体テクニックを身につけることができれば、より厳格な型チェックができるようになりそうですね。
それでは!
Discussion