モジュールのレッスン (1/2)
コレクションとハッシュマップ
コレクションは、複数の値を保持できるデータ構造です。プリミティブ配列やタプル型とは異なり、これらのコレクションが参照するデータはヒープに保存されます。つまり、コンパイル時にデータ量を知る必要がなく、プログラム実行中に動的に拡大または縮小できます。
Rust で最も一般的に使用される 2 つのコレクションは、ベクター (Vec<T>) と キーと値のマップ (HashMap<K, V>) です。
ベクトル (Vec<T>)
ベクトルを使用すると、同じ型の複数の値を 1 つのデータ構造に格納し、すべての値をメモリ内で並べて配置できます。
fn main() {
// Creating an empty mutable vector
let mut v: Vec<i32> = Vec::new();
// Or using the vec! macro
let mut v2 = vec![1, 2, 3];
// Appending elements
v.push(5);
v.push(6);
// Accessing elements by index
let third = v2[2];
println!("The third element is: {}", third);
}ハッシュマップ (HashMap<K, V>)
HashMap<K, V> コレクションには、K 型のキーの V 型の値へのマッピングが保存されます。これは、これらのキーと値がメモリにどのように配置されるかを決定するハッシュ関数を介して動作します。これは、数値インデックスではなくキー (名前や ID など) によってデータを検索する場合に非常に便利です。
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
// Inserting key-value pair
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// Reading a value (returns an Option<&V>)
let team_name = String::from("Blue");
let score = scores.get(&team_name);
match score {
Some(val) => println!("Score: {}", val),
None => println!("No score found."),
}
}自分で試してみてください
演習 1: Vec の基本操作
Vec::new() を使用して、 v という名前の変更可能な整数ベクトルを宣言します。プッシュメソッドを使用して、要素 10、20、および 30 を順番に追加します。最後に、println! を使用してベクトルの最初の要素 (インデックス 0) を出力します。
ヒントを表示
`let mut v = Vec::new();` を使用してベクトルを初期化し、`v.push(value)` で要素を挿入し、`v[0]` でアクセスします。
3 回の試行後に解決策が利用可能になります
演習 2: HashMap を使用したユーザー スコア
std::collections::HashMap をインポートします。 main 関数で、score という名前の変更可能な HashMap を宣言して、文字列キーと i32 値を保存します。ユーザー「Alice」のスコア 50 を挿入します。 get メソッドと unwrap() を使用してスコアを安全に抽出し、出力します。
ヒントを表示
「use std::collections::HashMap;」を忘れないでください。 `scores.insert(String::from("Alice"), 50);` で挿入し、`.get("Alice").unwrap()` で値を取得します。
3 回の試行後に解決策が利用可能になります
演習 3: ベクトル内の値を 2 倍にする
整数 &[i32] のスライスへの参照を受け入れ、同じ要素を 2 倍したものを含む新しい Vec<i32> を返す double_values という名前の関数を定義します。
ヒントを表示
関数はスライスの要素を反復処理し、それらの要素を 2 で乗算して、返される新しいベクトルに挿入する必要があります。
3 回の試行後に解決策が利用可能になります