## 構造体を定義し、インスタンス化する
- [[構造体 (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関数みたいなもの