HashMap

HashDoS 攻撃に対する保護を備えた標準のハッシュマップ:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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;
    }

    dbg!(page_counts);
}
  • HashMap は prelude には含まれていないため、スコープに導入する必要があります。

  • 次のコード行を試してみてください。最初の行は、本がハッシュマップ内にあるかどうかを確認し、見つからない場合は代替値を返します。2 行目は、本が見つからない場合にその代替値をハッシュマップに挿入します。

    // Copyright 2023 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    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]> を実装しており、これにより配列リテラルからハッシュマップを簡単に初期化できます:

      // Copyright 2023 Google LLC
      // SPDX-License-Identifier: Apache-2.0
      
      let page_counts = HashMap::from([
        ("Harry Potter and the Sorcerer's Stone".to_string(), 336),
        ("The Hunger Games".to_string(), 374),
      ]);
  • また、HashMap はキーと値のタプルを生成する任意の Iterator から構築できます。

  • この型には、std::collections::hash_map::Keys のような「メソッド固有」の戻り値型がいくつかあります。これらの型は Rust のドキュメントを検索するとよく現れます。この型のドキュメントと、keys メソッドへ戻るための便利なリンクを受講者に示してください。