HashMap
HashDoS 攻撃から保護する標準のハッシュマップ:
use std::collections::HashMap; fn main() { let mut page_counts = HashMap::new(); page_counts.insert("Adventures of Huckleberry Finn", 207); page_counts.insert("Grimms' Fairy Tales", 751); page_counts.insert("Pride and Prejudice", 303); if !page_counts.contains_key("Les Misérables") { println!( "We know about {} books, but not Les Misérables.", page_counts.len() ); } for book in ["Pride and Prejudice", "Alice's Adventure in Wonderland"] { match page_counts.get(book) { Some(count) => println!("{book}: {count} pages"), None => println!("{book} is unknown."), } } // 何も見つからなかった場合は、.entry() メソッドを使用して値を挿入します。 for book in ["Pride and Prejudice", "Alice's Adventure in Wonderland"] { let page_count: &mut i32 = page_counts.entry(book).or_insert(0); *page_count += 1; } println!("{page_counts:#?}"); }
This slide should take about 5 minutes.
-
HashMap
はプレリュードで定義されていないため、スコープに含める必要があります。 -
次のコード行を試します。最初の行で、書籍がハッシュマップにあるかどうかを確認し、ない場合は代替値を返します。書籍が見つからなかった場合、2 行目でハッシュマップに代替値を挿入します。
let pc1 = page_counts .get("Harry Potter and the Sorcerer's Stone") .unwrap_or(&336); let pc2 = page_counts .entry("The Hunger Games") .or_insert(374);
-
vec!
とは異なり、標準のhashmap!
マクロはありません。-
しかし、Rust 1.56 以降では、HashMap は
From<[(K, V); N]>
を実装しています。これにより、リテラル配列からハッシュマップを簡単に初期化できます。let page_counts = HashMap::from([ ("Harry Potter and the Sorcerer's Stone".to_string(), 336), ("The Hunger Games".to_string(), 374), ]);
-
-
別の方法として、HashMap は、Key-Value タプルを生成する任意の
Iterator
から作成することもできます。 -
この型には、
std::collections::hash_map::Keys
などの「メソッド固有の」戻り値の型がいくつかあります。これらの型は、Rust ドキュメントの検索でよく使用されます。この型のドキュメントと、keys
メソッドに戻るのに役立つリンクを受講者に示します。