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!(
            "Ми знаємо про {} книги, але не 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} сторінок"),
            None => println!("{book} невідома."),
        }
    }

    // Використовуйте метод .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 не визначено в prelude, і ії потрібно включити в область.

  • Спробуйте наступні рядки коду. У першому рядку буде показано, чи є книга в хеш-мапі, і якщо ні, повернеться альтернативне значення. У другому рядку буде вставлено альтернативне значення в хеш-мапу, якщо книга не знайдена.

    let pc1 = page_counts
        .get("Harry Potter and the Sorcerer's Stone")
        .unwrap_or(&336);
    let pc2 = page_counts
        .entry("The Hunger Games".to_string())
        .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 можна створити з будь-якого Iterator, який видає кортежі ключ-значення.

  • Ми показуємо HashMap<String, i32> і уникаємо використання &str як ключа, щоб полегшити приклади. Використання посилань у колекціях, звичайно, можливо, але це може призвести до ускладнень із перевіркою запозичень.

    • Спробуйте видалити to_string() із прикладу вище та подивіться, чи він усе ще компілюється. Як ви думаєте, де ми можемо зіткнутися з проблемами?
  • Цей тип має кілька "специфічних" типів повернення, таких як std::collections::hash_map::Keys. Ці типи часто з’являються під час пошуку в документації Rust. Покажіть учням документацію для цього типу та корисне посилання на метод keys.