導入
複数の値をひとまとめにする基本の型が タプル と 配列 です。どちらも「サイズがコンパイル時に決まっている」——つまり要素数が固定です。この「サイズが固定」という性質は、次章から学ぶスタックの話に直結します。
説明
タプルは、異なる型をまとめて1つにできる箱です。
fn main() {
let person: (&str, i32, f64) = ("Alice", 30, 1.65);
// 分解(destructuring)して取り出す
let (name, age, height) = person;
println!("{name} は {age} 歳, 身長 {height}m");
// .番号 でも取り出せる
println!("名前: {}", person.0);
}
("Alice", 30, 1.65)… 3つの異なる型(文字列・整数・小数)をひとまとめに。let (name, age, height) = person;… タプルを一気に分解して各変数へ。person.0,person.1… 添字(0始まり)でも取り出せます。
配列は、同じ型の値を固定個数ならべたものです。
fn main() {
let scores: [i32; 3] = [90, 80, 70]; // i32 が3個
let zeros = [0; 5]; // 0 を5個 → [0, 0, 0, 0, 0]
println!("最初の点数: {}", scores[0]); // 添字でアクセス
println!("要素数: {}", scores.len());
}
[i32; 3]… 「i32が3個」という型。要素数まで型の一部です。scores[0]… 添字は0始まり。範囲外(scores[3]など)にアクセスすると、Rust は実行時にパニックして不正なメモリ読み取りを防ぎます(C言語のような「たまたま動いてしまう」危険がありません)。
配列は要素数が固定です。「後から要素を増やしたい」ときは、第8章で学ぶ Vec(可変長の配列)を使います。この違いは「スタックに置けるか/ヒープが必要か」という、メモリの本質的な話につながっていきます。
試すには
scores[5] のように範囲外にアクセスするコードを書くと、コンパイル時または実行時に index out of bounds として弾かれます。配列の境界チェックが標準で入っているのが Rust の安全性の一例です。