// 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 30
- 辞書Copyトレイト
- 辞書Debugトレイト
- 辞書Defaultトレイト
- 辞書derive属性
- 辞書impl Trait
- 辞書pub
- 辞書use宣言
- 辞書コメント
- 辞書ジェネリクス
- 辞書タプル構造体
- 辞書トレイト
- 辞書トレイト境界
- 辞書マクロ
- 辞書モジュール
- 辞書ユニット様構造体
- 辞書ライフタイム
- 辞書ライフタイム注釈
- 辞書型推論
- 辞書構造体更新記法
- 辞書比較のトレイト
- 辞書比較演算子
- 辞書列挙型
- 本動かして学ぶRustプログラミング問題集 › 第10章 メソッドと関連関数
- 本動かして学ぶRustプログラミング問題集 › 第12章 OptionとResult
- 本動かして学ぶRustプログラミング問題集 › 第13章 モジュールと公開範囲
- 本動かして学ぶRustプログラミング問題集 › 第17章 ジェネリクス
- 本動かして学ぶRustプログラミング問題集 › 第18章 トレイト
- 本動かして学ぶRustプログラミング問題集 › 第19章 derive属性と標準トレイト
- 本動かして学ぶRustプログラミング問題集 › 第22章 ライフタイム
- 本動かして学ぶRustプログラミング問題集 › 第9章 構造体