Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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);
}
This slide should take about 5 minutes.
  • HashMap не входит в prelude, поэтому её нужно импортировать в область видимости.

  • Попробуйте следующие строки кода. Первая строка проверит, есть ли книга в хеш-таблице, и если нет, вернёт альтернативное значение. Вторая строка вставит альтернативное значение в хеш-таблицу, если книга не найдена.

    // 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.