はじめに
この実験では、Rust の HashMap について学びます。HashMap は、キーを使って値を格納するために使用されます。HashMap のキーは、ブール値、整数、文字列、または Eq と Hash トレイトを実装する他の任意の型を含む、さまざまな型であることができます。HashMap は、要素の数に基づいて動的に拡大および縮小することができます。HashMap::with_capacity(uint) を使って特定の容量で HashMap を作成することもできますし、デフォルトの初期容量で HashMap を取得するには HashMap::new() を使います。提供されたコード例は、連絡先の名前と電話番号を格納し、挿入、取得、変更、および削除などの操作を行うことで HashMap の使い方を示しています。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、
main.rsを使って、rustc main.rs &&./mainでコンパイルして実行することができます。
HashMap
ベクターは整数インデックスで値を格納するのに対し、HashMap はキーで値を格納します。HashMap のキーは、ブール値、整数、文字列、または Eq と Hash トレイトを実装する他の任意の型であることができます。次のセクションでこれについてもっと詳しく説明します。
ベクターと同様に、HashMap は拡張可能ですが、余分な空間がある場合には HashMap 自身も縮小することができます。HashMap::with_capacity(uint) を使って特定の初期容量で HashMap を作成することもできますし、デフォルトの初期容量で HashMap を取得するには HashMap::new() を使います(推奨)。
use std::collections::HashMap;
fn call(number: &str) -> &str {
match number {
"798-1364" => "We're sorry, the call cannot be completed as dialed.
Please hang up and try again.",
"645-7689" => "Hello, this is Mr. Awesome's Pizza. My name is Fred.
What can I get for you today?",
_ => "Hi! Who is this again?"
}
}
fn main() {
let mut contacts = HashMap::new();
contacts.insert("Daniel", "798-1364");
contacts.insert("Ashley", "645-7689");
contacts.insert("Katie", "435-8291");
contacts.insert("Robert", "956-1745");
// 参照を取り、Option<&V> を返す
match contacts.get(&"Daniel") {
Some(&number) => println!("Calling Daniel: {}", call(number)),
_ => println!("Don't have Daniel's number."),
}
// `HashMap::insert()` は、挿入される値が新しい場合には `None` を返し、
// それ以外の場合には `Some(value)` を返します
contacts.insert("Daniel", "164-6743");
match contacts.get(&"Ashley") {
Some(&number) => println!("Calling Ashley: {}", call(number)),
_ => println!("Don't have Ashley's number."),
}
contacts.remove(&"Ashley");
// `HashMap::iter()` は、(&'a key, &'a value) のペアを任意の順序で返すイテレータを返します。
for (contact, &number) in contacts.iter() {
println!("Calling {}: {}", contact, call(number));
}
}
ハッシュ化とハッシュマップ(時々ハッシュテーブルと呼ばれます)の仕組みに関する詳細は、Hash Table Wikipedia を参照してください。
まとめ
おめでとうございます!あなたは HashMap の実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習することができます。