Rustの配列(array)の使い方

470, 2022-05-10

目次

Rustの配列(array)の使い方

Rustでは基本のデータ型として固定長配列arrayがあります。
これを使えるようになっておくと、データをまとめたい時に便利です。

この記事ではRustの配列(array)の使い方について詳しく解説します。

関連記事
Rustのassert!の使い方【assert!, assert_eq!, assert_ne!】
RustのVecの使い方【vec!, push, pop】
RustのBoxの使い方【ヒープにメモリを確保!初心者向け】

配列の定義方法

Rustの配列の定義は↓のような文法で行います。

let 配列名: [型; 要素数] = 初期化指定;

初期化指定を指定しない場合はエラーになるので注意が必要です。

配列の要素数を0クリアする

以下のフォーマットで配列を定義すると配列を0クリアして定義できます。

let 配列名: [型; 要素数] = [初期価値; 要素数];

具体的なコードは↓になります。

    // 要素数3の配列を0クリアする
    let ary0: [i32; 3] = [0; 3];

    println!("len is {}", ary0.len());  // len is 3
    println!("{}", ary0[0]);  // 0
    println!("{}", ary0[1]);  // 0
    println!("{}", ary0[2]);  // 0

ary0.len()など、len()を使うと配列の長さを取得できます。
↑の定義では配列の長さは3になっています。
各要素は0で初期化されているのがわかります。

配列の要素を指定した値で初期化する

以下のフォーマットで配列を定義すると配列の要素の値を指定して配列を初期化できます。

let 配列名: [型; 要素数] = [値0, 値1, 値2, ...];

コードでは↓のようになります。

    // 要素数3の配列を[0, 1, 2]で初期化
    let ary1: [i32; 3] = [0, 1, 2];

    println!("len is {}", ary1.len());  // len is 3
    println!("{}", ary1[0]);  // 0
    println!("{}", ary1[1]);  // 1
    println!("{}", ary1[2]);  // 2

↑の定義では配列ary1[0, 1, 2]で初期化しています。
各要素にはそれぞれ0, 1, 2の値が格納されています。

配列の要素をfor文で回す

配列はfor文で回すことができます。
for文で配列を回すと、配列の先頭の要素から順にアクセス可能です。

    // 配列をfor文で回す
    let ary2: [i32; 3] = [10, 11, 12];

    for el in ary2 {
        println!("{}", el);
        // 10
        // 11
        // 12
    }

    for i in 0..ary2.len() {
        println!("{} {}", i, ary2[i]);
        // 0 10
        // 1 11
        // 2 12
    }

↑のようにfor el in ary2 {...}と書くのが一番ラクです。
添え字を使いたい場合はfor i in 0..ary2.len() {...}と書く方法もあります。
これはiter()enumerate()を組み合わせても実現できます(後述)。

配列の要素を参照で回す

配列の要素を参照で回したい場合は、配列の先頭に&を付けてfor文に渡します。

    // 配列の要素の参照をfor文で回す
    let ary3: [i32; 3] = [10, 11, 12];

    for el in &ary3 {
        println!("{}", el);
        // let a: i32 = el;
        // expected `i32`, found `&i32`
    }

↑のコメントアウトされている「// let a: i32 = el;」に注目してください。
これのコメントを解除すると「expected i32, found &i32」とエラーが出力されます。
これはつまりfor文で回している要素elが参照(&i32)になっていることを示しています。

配列をiter()で回す

配列のメソッドiter()を使ってfor文で回すこともできます。

    // 配列をiter()を使って回す
    let ary5: [i32; 3] = [1, 2, 3];

    for item in ary5.iter() {
        println!("{}", a);
        // 1
        // 2
        // 3

        // let a: i32 = item;
        // expected `i32`, found `&i32`
    }

iter()を使った場合、for文で回される要素は参照になります。
試しに↑のコードの「// let a: i32 = item;」のコメントを解除してみてください。
itemが参照になっている旨のエラーが出力されます。

配列の添え字と要素をfor文で一緒に取り出す

配列の添え字と要素を一緒に取り出したい場合があると思います。
そういう時はRustではiter()enumerate()を組み合わせて使います。
↓のようにです。

    // 配列をiter().enumerate()を使って回す
    // 添え字と要素を同時に取り出す
    let ary6: [i32; 3] = [10, 20, 30];

    for (i, x) in ary6.iter().enumerate() {
        println!("{} {}", i, x);
        // 0 10
        // 1 20
        // 2 30
    }

↑のようにするとiには添え字が、xには要素が展開されます。
enumerate()iter()の結果から添え字を取り出す役割を果たしています。

変更可能(ミュータブル)な配列を定義する

Rustはデフォルトで変数や配列がイミュータブル(変更不可能)になります。
配列の定義のときにmutを付けておくと後から配列の要素を変更できるようになります。

    // ミュータブルな配列を作る
    let mut mary: [i32; 3] = [1, 2, 3];

    mary[1] = 20;
    mary[2] = 30;

    for el in mary {
        println!("{}", el);
        // 1
        // 20
        // 30
    }

配列を変数に展開(アンパック)する

配列の各要素は↓のようにすると変数に展開することができます。

    // 配列の要素を変数に展開する
    let ary4: [i32; 3] = [1, 2, 3];
    let [one, two, three] = ary4;

    println!("{} {} {}", one, two, three);

↑の例ではoneにはary4[0]の値が。
twoにはary4[1]の値が。
threeにはary4[2]の値が入ります。

おわりに

今回はRustの配列(array)について解説しました。
配列を使えるようになっておくとRustによるプログラミングもはかどるかと思います。

(^ _ ^)

砂利道はarray(荒い)

(・ v ・)

おっさん・・・

この記事のアンケートを送信する