Rust 速習チュートリアル

Rust の配列

1. 配列 (Arrays)

配列は、各値に対して個別の変数を宣言する代わりに、複数の値を単一の変数に格納するために使用されます。

2. 配列の作成

配列を作成するには、角括弧 [ ] を使用し、値をカンマで区切ります。

注記: すべての値が同じデータ型(以下の例では整数型)であることを確認してください。

サンプルコード

let numbers = [1, 2, 3, 4, 5];

これにより、5つの整数を持つ配列が作成されます。

3. 配列要素へのアクセス

配列の要素にアクセスするには、そのインデックス番号を参照します。

配列のインデックスは0から始まります。[0] が最初の要素、[1] が2番目の要素、となります。
以下のステートメントは、numbers の最初の要素 [0] の値にアクセスします。

サンプルコード

let numbers = [1, 2, 3, 4, 5];
println!("最初の数値は: {}", numbers[0]);

4. 配列の値の変更

特定の要素の値を変更するには、インデックス番号を参照して新しい値を代入します。

配列を「ミュータブル(変更可能)」にする必要があることを忘れないでください(mut キーワードを使用します)。

サンプルコード

let mut numbers = [1, 2, 3, 4, 5];
numbers[0] = 10;
println!("新しい最初の数値は: {}", numbers[0]);

5. 配列の長さ

.len() メソッドを使用すると、配列内の要素数を取得できます。

サンプルコード

let numbers = [1, 2, 3, 4, 5];
println!("この配列には {} 個の要素があります。", numbers.len());

6. 配列のループ処理

for ループを使用して、配列の要素を反復処理できます。

サンプルコード

let fruits = ["apple", "banana", "orange"];
for fruit in fruits {
  println!("私は {} が好きです。", fruit);
}

7. 配列全体の出力

注記: 配列全体をプリントする場合は、println! の中で {:?} を使用する必要があります。

サンプルコード

let numbers = [1, 2, 3, 4, 5];
println!("{:?}", numbers);

配列から1つの要素だけをプリントする場合は、{} を使用できます。

サンプルコード

let numbers = [1, 2, 3, 4, 5];
println!("{}", numbers[0]);

7.1 まとめ

  • 配列から単一の要素をプリントする場合は {} を使用します。
  • 配列全体をプリントする場合は {:?} を使用します。

先ほどのループの例で {:?} を使用しなかった理由は、ループ内では配列から取り出した「単一の値」をプリントしているからです。各値は文字列(または数値)であるため、 {} が機能します。しかし、配列という構造体全体を出力するには {:?} が必要です。

基本的な型(文字列、数値、ブーリアンなど)には {} を使い、配列やベクタなどのデータ構造全体をプリントする場合には {:?} を使う、と覚えておくと良いでしょう。

8. 固定長(配列) vs 動的サイズ(ベクタ)

Rustの配列について語る際、「固定長(Fixed size)」と「動的サイズ(Dynamic size)」という用語をよく耳にするでしょう。

これは、Rustの配列が固定サイズであり、配列の作成後に要素を追加したり削除したりできないためです。

サンプルコード

// 3つの要素を持つ配列
let mut cars = ["Volvo", "BMW", "Ford"];

// cars配列に別の要素(4番目の要素)を追加しようとするとエラーになります
cars[3] = "Mazda";   // エラー: インデックスが範囲外(index out of bounds)です

9. ベクタ - 動的サイズの例

配列要素の追加や削除が必要な操作には、サイズ変更可能な配列である ベクタ(Vectors) を使用できます。
ベクタのサイズは動的であり、必要に応じて拡張したり縮小したりできます。

ベクタを作成するには vec! マクロを使用します。

サンプルコード

// 3つの要素を持つベクタ
let mut cars = vec!["Volvo", "BMW", "Ford"];

// 要素を追加
cars.push("Mazda");

println!("{:?}", cars); // ["Volvo", "BMW", "Ford", "Mazda"]

これはベクタに関する短い導入に過ぎません。詳細については、次章でさらに深く掘り下げていきます。