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 メソッドに戻るのに役立つリンクを受講者に示します。