// dictionary
構造体.
構造体(struct)は、複数の値を名前付きの「フィールド」としてひとまとめにする、ユーザーが独自に定義する複合型です。タプル型と違い各値に名前が付くため、フィールドの並び順を覚えていなくても意味が分かります。なおstructキーワードでは、本項で扱う名前付きフィールド構造体のほか、フィールドに名前を付けないタプル構造体や、フィールドを持たないユニット様構造体も定義できます。
// 構造体定義
struct User {
name: String,
age: u32,
active: bool,
}
fn main() {
// 構造体のインスタンス作成
let user = User {
name: String::from("田中"),
age: 28,
active: true,
};
// フィールドへは . でアクセス
println!("{}さん({}歳)", user.name, user.age);
}Playgroundで開く定義とアクセス
structキーワードで構造体名と各フィールドの名前・型を宣言します。インスタンスを作るときは構造体名 { フィールド名: 値, ... }の形で全フィールドに値を渡します(他インスタンスの値を流用する構造体更新記法..もあります)。フィールドへのアクセスはドット.に続けてフィールド名を書きます。
構造体は変数と同様にそのフィールドも含めてデフォルトで不変です。インスタンスをlet mutで変数に束縛すると、user.age = 29;のようにフィールドを書き換えられます。
フィールド初期化省略記法
スコープ内の変数名がフィールド名と一致する場合、name: nameのような冗長な記述をnameだけに省略できます(関数の引数として受け取った変数もこれに該当します)。
struct User {
name: String,
age: u32,
}
fn build_user(name: String, age: u32) -> User {
User { name, age } // name: name, age: age の省略形
}
fn main() {
let user = build_user(String::from("鈴木"), 35);
println!("{}さん", user.name);
}Playgroundで開く補足
構造体のデバッグ出力
構造体はデフォルトではprintln!の{}や{:?}で表示できません。構造体定義の直前に#[derive(Debug)]属性を付けると、{:?}(1行)や{:#?}(整形)でフィールドの内容を出力できるようになります。println!に関する詳細はコンソール出力をご確認ください。
#[derive(Debug)]
struct User {
name: String,
age: u32,
}
fn main() {
let user = User { name: String::from("佐藤"), age: 40 };
println!("{user:?}"); // User { name: "佐藤", age: 40 }
println!("{user:#?}"); // フィールドごとに改行して整形表示
}Playgroundで開くこの辞書が使われているページ
backlinks 11