コレクション基礎
複数のデータをまとめて扱う「配列」「タプル」「Vec」について学びます。
配列(Array)
同じ型のデータを固定長で並べたものです。
配列の作成
fn main() {
let numbers = [1, 2, 3, 4, 5];
println!("{:?}", numbers);
}
型と長さの指定
#![allow(unused)]
fn main() {
let numbers: [i32; 5] = [1, 2, 3, 4, 5];
// 型 長さ
}
同じ値で初期化
#![allow(unused)]
fn main() {
let zeros = [0; 5]; // [0, 0, 0, 0, 0]
}
要素へのアクセス
fn main() {
let numbers = [10, 20, 30, 40, 50];
println!("1番目: {}", numbers[0]); // 10
println!("3番目: {}", numbers[2]); // 30
println!("長さ: {}", numbers.len()); // 5
}
インデックスは0から始まります!
配列の繰り返し
fn main() {
let numbers = [1, 2, 3, 4, 5];
for n in numbers {
println!("{}", n);
}
}
配列の制限
- 長さが固定: 作成後に増減できない
- 同じ型のみ: 異なる型は混ぜられない
#![allow(unused)]
fn main() {
// エラー:長さが違う
// let arr: [i32; 5] = [1, 2, 3];
// エラー:型が混在
// let arr = [1, "two", 3];
}
タプル(Tuple)
異なる型のデータをまとめられます。
タプルの作成
fn main() {
let person = ("太郎", 25, 170.5);
println!("{:?}", person);
}
型の指定
#![allow(unused)]
fn main() {
let person: (&str, i32, f64) = ("太郎", 25, 170.5);
}
要素へのアクセス
fn main() {
let person = ("太郎", 25, 170.5);
println!("名前: {}", person.0); // 太郎
println!("年齢: {}", person.1); // 25
println!("身長: {}", person.2); // 170.5
}
分解(Destructuring)
fn main() {
let person = ("太郎", 25, 170.5);
let (name, age, height) = person;
println!("{}さんは{}歳、身長{}cm", name, age, height);
}
関数の複数戻り値として使う
fn main() {
let (min, max) = min_max(5, 10, 3);
println!("最小: {}, 最大: {}", min, max);
}
fn min_max(a: i32, b: i32, c: i32) -> (i32, i32) {
let min = if a < b && a < c { a } else if b < c { b } else { c };
let max = if a > b && a > c { a } else if b > c { b } else { c };
(min, max)
}
Vec(ベクター)
可変長の配列です。要素を追加・削除できます。
Vecの作成
fn main() {
// 空のVec
let mut numbers: Vec<i32> = Vec::new();
// マクロを使った作成
let numbers = vec![1, 2, 3, 4, 5];
println!("{:?}", numbers);
}
要素の追加
fn main() {
let mut numbers = Vec::new();
numbers.push(1);
numbers.push(2);
numbers.push(3);
println!("{:?}", numbers); // [1, 2, 3]
}
要素の削除
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5];
let last = numbers.pop(); // 最後の要素を取り出す
println!("取り出した値: {:?}", last); // Some(5)
println!("残り: {:?}", numbers); // [1, 2, 3, 4]
}
要素へのアクセス
fn main() {
let numbers = vec![10, 20, 30, 40, 50];
// インデックスでアクセス(範囲外でパニック)
println!("{}", numbers[0]); // 10
// getでアクセス(範囲外でNone)
match numbers.get(10) {
Some(n) => println!("{}", n),
None => println!("範囲外"),
}
}
Vecの繰り返し
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
for n in &numbers { // 参照で繰り返す
println!("{}", n);
}
println!("Vecはまだ使える: {:?}", numbers);
}
Vecの便利なメソッド
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
println!("長さ: {}", numbers.len()); // 5
println!("空?: {}", numbers.is_empty()); // false
println!("含む?: {}", numbers.contains(&3)); // true
}
比較表
| 特徴 | 配列 | タプル | Vec |
|---|---|---|---|
| 長さ | 固定 | 固定 | 可変 |
| 型 | 同じ型のみ | 異なる型OK | 同じ型のみ |
| アクセス | arr[i] | tuple.i | vec[i] or vec.get(i) |
| 用途 | 固定サイズのデータ | 複数の戻り値 | 動的なリスト |
使い分け
配列を使う場面
- データ数が決まっている
- 変更する必要がない
#![allow(unused)]
fn main() {
let days = ["月", "火", "水", "木", "金", "土", "日"];
}
タプルを使う場面
- 異なる型のデータをまとめる
- 関数から複数の値を返す
#![allow(unused)]
fn main() {
fn get_user() -> (&str, i32) {
("太郎", 25)
}
}
Vecを使う場面
- データ数が変わる
- 要素を追加・削除する
#![allow(unused)]
fn main() {
let mut todo_list = vec!["買い物", "掃除"];
todo_list.push("洗濯");
}
まとめ
| コレクション | 作成 | 長さ | 型の制限 |
|---|---|---|---|
| 配列 | [1, 2, 3] | 固定 | 同じ型のみ |
| タプル | (1, "a", true) | 固定 | 異なる型OK |
| Vec | vec![1, 2, 3] | 可変 | 同じ型のみ |
確認テスト
Q1. 配列とVecの違いは?
正解: B) 配列は作成時に長さが決まり変更できません。Vecは
push や pop で要素を追加・削除できます。
Q2. タプルの要素にアクセスする方法は?
正解: B) タプルはドット記法とインデックスでアクセスします。配列やVecのような
[] は使いません。
Q3. 以下のコードの出力は?let mut v = vec![1, 2, 3]; v.push(4); v.pop(); v.push(5); println!("{:?}", v);
正解: D) 初期: [1, 2, 3] → push(4): [1, 2, 3, 4] → pop(): [1, 2, 3](4が削除) → push(5): [1, 2, 3, 5]
Q4. let numbers = vec![1, 2, 3]; numbers.push(4); のエラーを修正するには?
正解: A)
push を呼ぶには変数が mut である必要があります。let mut numbers = vec![1, 2, 3]; と変更します。
Q5. 空のVecに1から10までの偶数を追加した場合、合計はいくつ?
正解: C) 1から10までの偶数は 2, 4, 6, 8, 10 です。合計は 2 + 4 + 6 + 8 + 10 = 30 です。
次のドキュメント: 06_error_handling_intro.md