## 構造体を定義し、インスタンス化する - [[構造体 (Rust)|構造体]] - [[Rustでは構造体の一部のフィールドのみを可変にすることはできない]] - [[フィールド初期化省略記法]] - [[構造体更新記法]] - [[タプル構造体]] [[構造体 (Rust)|構造体]]の[[フィールド (Rust)|フィールド]]で型に[[参照]]を利用することの弊害について。 ```rust struct User { id: i32, // Userが有効なとき、nameは有効でないといけない // nameが無効なとき、userも無効でないといけない // (Userが無効なとき、nameが有効なのは問題ない) // (nameが有効なとき、Userが無効なのは問題ない) name: &str, } fn main() { let mimizou = User { id: 1, name: "mimizou".to_string(), }; } ``` ここでは本来触れる必要はないが、[[ライフタイム]]の出番というわけだ。 ```rust #[derive(Debug)] struct User<'a> { id: i32, // Userとnameは同じライフタイム 'a として一蓮托生を保証 name: &'a str, } fn main() { let mimizou = User { id: 1, name: "mimizou", }; eprintln!("mimizou = {:?}", mimizou); } ``` ## 構造体を使ったプログラム例 - [[トレイト]]登場 - [[Debugトレイト]] - [[Displayトレイト]] ## メソッド記法 ```rust #[derive(Debug)] struct Rectangle { width: u32, height: u32, } // ここがポイント impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; eprintln!("rect1.area() = {:?}", rect1.area()); } ``` - [[自動参照および参照外し]] - [[関連関数]]はstatic関数みたいなもの