第12章 タプルと配列
この章の目的
この章を終えるころには、タプルと配列という2つの異なる方法で、位置によって値をまとめられるようになります。
タプル、固定された値のグループ
構造体はその部分に名前を付けます。一方で、値の小さなグループには名前ではなく順序だけが必要な場合もあります。括弧で書かれた値の組はタプルです。
let event = (60, 4);
そのタプルは音高と拍数を、その順序で保持します。タプルの部分には位置によってアクセスし、0から始まります。event.0 は 60 であり、event.1 は 4 です。
タプルは一度の手順で名前付きの束縛へと分解することもできます。これを分解束縛(デストラクチャリング)と呼びます。
let (pitch, beats) = event;
その行の後、pitch は 60 であり、beats は 4 です。
配列、1つの型からなる固定長の並び
配列は、すべて同じ型で、プログラムを書く時点で長さが固定された値の並びです。角括弧で書きます。
let scale = [0, 2, 4, 5, 7, 9, 11, 12];
要素はその位置によって読み取られ、こちらも0から始まり、scale[2] のように書きます。その配列の型は [Word; 8] と書き、8個の Word 値を意味します。
長さは型の一部であり、決して変わりません。配列は伸縮しません。これがそのメモリ使用量を事前に既知にするものであり、第1章が言語の約束の1つとして述べた点です。
両方を使うプログラム
fn main() -> Word {
let event = (60, 4);
let (pitch, beats) = event;
let scale = [0, 2, 4, 5, 7, 9, 11, 12];
pitch + scale[2] + beats
}
keleusma runで実行します。出力は次のとおりです。
68
タプル event は pitch(これは 60)と beats(これは 4)に分解されます。配列 scale は第3章の長音階のステップパターンを保持し、scale[2] はその3番目の要素である 4 です。合計は 60 + 4 + 4 で、68 になります。
タプルか構造体か、配列か列挙型か
タプルと構造体はどちらも、同時に存在する値をまとめます。各部分に名前を付ける価値があるときは構造体を、短く順序のあるグループが名前なしの方が明快なときはタプルを用いてください。
配列は1つの型の多数の値を保持します。列挙型は固定された型の集合のうち1つの値を保持します。両者は互いの代替ではありません。それらは異なる問いに答えます。
この章のまとめ
- タプル
(a, b)は位置によって値をまとめ、.0、.1などで読み取るか、let (a, b) = ...で分解束縛します。 - 配列
[a, b, c]は1つの型からなる固定長の並びであり、array[index]で読み取ります。 - 配列の長さは固定されており、その型の一部です。
- 末尾を越えて指すインデックスは、インデックス構文
array[i] { ok(v) => ..., invalid_index(idx) => ... }で処理されます。第23章を参照してください。
次章では、値の形に基づいて選択するための道具である match を詳しく学びます。