ベクター データ型を調べる

完了

配列と同様に、ベクターには、データ型が同じ複数の値を格納します。 ベクターのサイズまたは長さは、配列とは異なり、いつでも拡大または縮小できます。 時間の経過に伴ってサイズが変化するかどうかは、コンパイル時に暗黙的に示されます。 その結果、Rust では、配列内での範囲外のアクセスの場合と同様に、ベクター内の無効な位置にアクセスすることを阻止できない可能性があります。

ベクターを定義する

Rust 言語のコードを読むと、構文 <T> があることがわかります。 この構文は、ジェネリック型 T の使用を表します。 実際のデータ型がまだわかっていない場合は、ジェネリック型宣言を使用します。

ジェネリック型の構文は、ベクターを宣言するために使用されます。 構文 <vector><T> では、ジェネリック (未知) データ型 T で構成されるベクター型が宣言されます。 実際にベクターを作成するには、<vector>u32 のような具象型、u32 型のベクター、または String 型のベクターである <vector>String を使用します。

ベクターを宣言して初期化する一般的な方法は、vec! マクロを使用することです。 このマクロでは、配列コンストラクターと同じ構文も受け入れられます。

// Declare vector, initialize with three values
let three_nums = vec![15, 3, 46];
println!("Initial vector: {:?}", three_nums);  
  
// Declare vector, value = "0", length = 5
let zeroes = vec![0; 5];
println!("Zeroes: {:?}", zeroes); 

出力は次のようになります。

Initial vector: [15, 3, 46]
Zeroes: [0, 0, 0, 0, 0]

この例では、println! マクロでコロン疑問符 {:?} 構文を使用します。 Rust では、整数のベクターを表示する方法がわかりません。 特殊な書式設定を使用せずにベクター情報を表示しようとすると、コンパイラからエラーが発行されます。 空の中かっこ {} を使用して、ベクター値を表示できます。

ベクトルは、Vec::new() メソッドを使用して作成することもできます。 このベクター作成メソッドを使用すると、ベクターの末尾に値を追加および削除できます。 この動作をサポートするために、mut キーワードを使用してベクター変数を変更可能として宣言します。

// Create empty vector, declare vector mutable so it can grow and shrink
let mut fruit = Vec::new();

プッシュ値とポップ値

Vec::new() メソッドを使用してベクターを作成する場合は、ベクターの末尾に値を追加および削除できます。

ベクターの末尾に値を追加するには、push(<value>) メソッドを使用します。

// Push values onto end of vector, type changes from generic `T` to String
fruit.push("Apple");
fruit.push("Banana");
fruit.push("Cherry");
println!("Fruits: {:?}", fruit); 

出力では、ベクターを表す角かっこと、各 String 値を囲む引用符も表示されることに注意してください。

Fruits: ["Apple", "Banana", "Cherry"]

ベクターの型が具象型に設定された後は、その特定の型の値のみをベクターに追加できます。 別の型の値を追加しようとすると、コンパイラからエラーが返されます。

// Push integer value, but vector expects String (&str) type value
fruit.push(1);

コンパイラ エラー:

error[E0308]: mismatched types
  --> src/main.rs:11:17
   |
11 |     fruit.push(1);
   |                ^ expected `&str`, found integer

error: aborting due to previous error

ベクターの末尾にある値を削除するには、pop() メソッドを使用します。

// Pop off value at end of vector
// Call pop() method from inside println! macro
println!("Pop off: {:?}", fruit.pop());
println!("Fruits: {:?}", fruit); 

出力には、"Cherry" 値が削除され、ベクターにアタッチされていないことが示されます。

Pop off: Some("Cherry")
Fruits: ["Apple", "Banana"]

ベクターにインデックスを付ける

ベクターでは、配列と同じ方法でインデックスがサポートされます。 インデックスを使用してベクター内の要素値にアクセスできます。 最初の要素はインデックス 0 にあり、最後の要素はベクターの長さ - 1 にあります。

// Declare vector, initialize with three values
let mut index_vec = vec![15, 3, 46];
let three = index_vec[1];
println!("Vector: {:?}, three = {}", index_vec, three);  

出力は次のようになります。

Vector: [15, 3, 46], three = 3

ベクター値は変更可能なので、インデックスを使用して要素の値にアクセスすることで、値を変更できます。

// Add 5 to the value at index 1, which is 5 + 3 = 8
index_vec[1] = index_vec[1] + 5;
println!("Vector: {:?}", index_vec);  

出力は次のようになります。

Vector: [15, 8, 46]

境界外のインデックス値を監視する

配列と同様に、許可された範囲内にないインデックスを持つベクター内の要素にはアクセスできません。 この型の式は、配列の場合は、コンパイラからエラーが返されます。 ベクターの場合、コンパイルは成功しますが、プログラムは式で回復不可能なパニック状態になり、プログラムの実行は停止されます。

3 つの要素を持つベクターの例では、インデックス 10 にある要素にアクセスしようとするとどうなるでしょうか。

// Access vector with out-of-bounds index
let beyond = index_vec[10];
println!("{}", beyond);

プログラムは中止され、次のエラー メッセージが表示されます。

thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 10'...

別のモジュールで、プログラム パニックを引き起こさずにベクター要素に安全にアクセスする方法を調べます。

この Rust Playground 内で、このコードを実行してベクターを調べることができます。

自分の知識をチェックする

次の質問に答えて、学習した内容を確認してください。 質問ごとに回答を 1 つ選択して、[回答を確認] を選択します。

1.

データ型がわからない場合にベクターを宣言するにはどうすればよいですか?

2.

pop 関数では、ベクターに対してどのような処理が行われますか?

3.

ベクター サイズより大きいインデックスを使用してベクター要素にアクセスしようとするとどうなりますか?