Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

コレクション基礎

複数のデータをまとめて扱う「配列」「タプル」「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.ivec[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
Vecvec![1, 2, 3]可変同じ型のみ

確認テスト

Q1. 配列とVecの違いは?

Q2. タプルの要素にアクセスする方法は?

Q3. 以下のコードの出力は?
let mut v = vec![1, 2, 3]; v.push(4); v.pop(); v.push(5); println!("{:?}", v);

Q4. let numbers = vec![1, 2, 3]; numbers.push(4); のエラーを修正するには?

Q5. 空のVecに1から10までの偶数を追加した場合、合計はいくつ?


次のドキュメント: 06_error_handling_intro.md