構造体
struct キーワードを使って作成できる構造体("structs")には、次の 3 種類があります。
- タプル構造体。基本的には名前付きタプルです。
- 従来の C の構造体
- ユニット構造体。フィールドを持たず、ジェネリクスで有用です。
// 未使用コードの警告を非表示にする属性。 #![allow(dead_code)] #[derive(Debug)] struct Person { name: String, age: u8, } // ユニット構造体 struct Unit; // タプル構造体 struct Pair(i32, f32); // 2 つのフィールドを持つ構造体 struct Point { x: f32, y: f32, } // 構造体は別の構造体のフィールドとして再利用できる struct Rectangle { // 長方形は、空間内で左上と右下の角がどこにあるかによって // 指定できる。 top_left: Point, bottom_right: Point, } fn main() { // フィールド初期化省略記法で構造体を作成する let name = String::from("Peter"); let age = 27; let peter = Person { name, age }; // デバッグ構造体を出力する println!("{:?}", peter); // `Point` をインスタンス化する let point: Point = Point { x: 5.2, y: 0.4 }; let another_point: Point = Point { x: 10.3, y: 0.2 }; // point のフィールドにアクセスする println!("point coordinates: ({}, {})", point.x, point.y); // 構造体更新構文を使って、もう一方のフィールドを利用しながら // 新しい点を作成する let bottom_right = Point { x: 10.3, ..another_point }; // そのフィールドを `another_point` から使ったため、`bottom_right.y` は // `another_point.y` と同じになる println!("second point: ({}, {})", bottom_right.x, bottom_right.y); // `let` 束縛を使って point を分配束縛する let Point { x: left_edge, y: top_edge } = point; let _rectangle = Rectangle { // 構造体のインスタンス化も式である top_left: Point { x: left_edge, y: top_edge }, bottom_right: bottom_right, }; // ユニット構造体をインスタンス化する let _unit = Unit; // タプル構造体をインスタンス化する let pair = Pair(1, 0.1); // タプル構造体のフィールドにアクセスする println!("pair contains {:?} and {:?}", pair.0, pair.1); // タプル構造体を分配束縛する let Pair(integer, decimal) = pair; println!("pair contains {:?} and {:?}", integer, decimal); }
アクティビティ
Rectangleの面積を計算する関数rect_areaを追加してください(ネストした分配束縛を使ってみてください)。Pointとf32を引数に取り、その点を左上の角とし、幅と高さが そのf32に対応するRectangleを返す関数squareを追加してください。