第10章. 構造体
この章の目的
この章を読み終える頃には、関係し合う複数の値を一つの名前付きの形にまとめられるようになります。この章を読み終える頃には、関係し合う複数の値を一つの名前付きの形にまとめられるようになります。
音はピッチだけではない
一つの音は同時にいくつもの事実を持ち運びます。ピッチがあります。音量、いわゆるベロシティがあります。長さがあるかもしれません。これらの事実は一緒に属するものです。これらを別々の3つの値として、常に正しい順序で持ち回るのは、まちがいやすいやり方です。構造体はそれらを、名前の付いた部品を持つ一つの値にまとめます。一つの音は同時にいくつもの事実を持ち運びます。ピッチがあります。音量、いわゆるベロシティがあります。長さがあるかもしれません。これらの事実は一緒に属するものです。これらを別々の3つの値として、常に正しい順序で持ち回るのは、まちがいやすいやり方です。構造体はそれらを、名前の付いた部品を持つ一つの値にまとめます。
構造体を宣言する
構造体の宣言は、各部品にそれぞれ名前と型を付けて並べます。
struct Note {
pitch: Word,
velocity: Word,
}
これはNoteという新しい型を宣言しています。Noteの値は2つの部品、つまり「フィールド」を持ちます — pitchとvelocityで、それぞれWordです。これはNoteという新しい型を宣言しています。Noteの値は2つの部品、つまり「フィールド」を持ちます — pitchとvelocityで、それぞれWordです。
構造体を作って使う
これはNoteを作り、そのフィールドを読む完全なプログラムです。
struct Note {
pitch: Word,
velocity: Word,
}
fn brightness(n: Note) -> Word {
n.pitch + n.velocity
}
fn main() -> Word {
let middle_c = Note { pitch: 60, velocity: 90 };
brightness(middle_c)
}
keleusma runで実行します。出力は次のとおりです。
150
3つのことが起こっています。
Note { pitch: 60, velocity: 90 }がNoteを構築します。各フィールドに名前で値を与えています。これを「構築」と呼びます。Note { pitch: 60, velocity: 90 }がNoteを構築します。各フィールドに名前で値を与えています。これを「構築」と呼びます。brightnessは2つのバラバラな数ではなく、一つのNote全体をパラメータとして取ります。2つの事実が一緒に旅をします。brightnessは2つのバラバラな数ではなく、一つのNote全体をパラメータとして取ります。2つの事実が一緒に旅をします。n.pitchとn.velocityがフィールドを読みます。フィールドは「値、ドット、フィールド名」と書いて取り出します。n.pitchとn.velocityがフィールドを読みます。フィールドは「値、ドット、フィールド名」と書いて取り出します。
まとめる利点
構造体のおかげで、関数のシグネチャに本当に意図したことを書けます。brightnessはNoteを受け取るのであって、呼び出し側が正しい順で渡さなければならない2つの数を受け取るわけではありません。データの構造は宣言の一箇所に書かれ、プログラムのどの部分もそれに従って動きます。構造体のおかげで、関数のシグネチャに本当に意図したことを書けます。brightnessはNoteを受け取るのであって、呼び出し側が正しい順で渡さなければならない2つの数を受け取るわけではありません。データの構造は宣言の一箇所に書かれ、プログラムのどの部分もそれに従って動きます。
この章のまとめ
struct Name { field: Type, ... }は新しい型をまとめて宣言します。Name { field: value, ... }はその型の値を構築します。value.fieldでフィールドを読みます。
次の章では、決まった選択肢のうちの一つになる値を扱います。