Перейти к основному содержимому
  1. Rust/

Hash Map в Rust: полное руководство по HashMap и ключам

·962 слова·5 минут· loading · loading · · ·Rust-basic
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
12 Hash Map в Rust: полное руководство по HashMap и ключам (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Введение
#

Hash Map — это коллекция пар “ключ-значение”, которая позволяет быстро находить значения по ключу. Представьте ее как справочник, где вы моментально получаете нужную информацию.

Создание HashMap и добавление элементов
#

Для создания пустого HashMap используется функция HashMap::new(). Чтобы наполнить коллекцию данными, её необходимо сделать изменяемой с помощью ключевого слова mut, после чего использовать метод insert(key, value).

Давайте посмотрим на интерактивном слайде, как создаётся HashMap, вставляются новые значения и как обновить существующее значение:

Базовые операции с HashMap: создание, вставка и обновление
Шаг 1/2
 1use std::collections::HashMap;
 2
 3fn main() {
 4    // Создаем изменяемый HashMap
 5    let mut smart_home = HashMap::new();
 6
 7    // Добавляем устройства и их состояние
 8    smart_home.insert("гостиная_свет".to_string(), "включен".to_string());
 9    smart_home.insert("спальня_термостат".to_string(), "22°C".to_string());
10
11    println!("Устройства: {:?}", smart_home);
12}

Создание HashMap и добавление элементов

  • Для использования HashMap импортируем его из std::collections.
  • Чтобы наполнить коллекцию данными, она должна быть объявлена изменяемой (mut).
  • Метод insert(key, value) добавляет новую пару ключ-значение в мапу.

Получение значений и Entry API
#

При поиске значений в HashMap по ключу основным инструментом является метод .get(). Он возвращает перечисление Option<&V>, что защищает программу от ошибок обращения к отсутствующим элементам. Также Rust предоставляет мощный Entry API для условных операций (добавление или изменение значений только при выполнении определенных условий).

Давайте подробно разберем, как искать элементы, обрабатывать их отсутствие и использовать Entry API на интерактивном слайде:

Поиск значений, unwrap_or и Entry API
Шаг 1/3
 1use std::collections::HashMap;
 2
 3fn main() {
 4    let mut smart_home = HashMap::new();
 5    smart_home.insert("гостиная_свет", "включен");
 6
 7    // Метод get() возвращает Option<&V>
 8    let light_status = smart_home.get("гостиная_свет");
 9    let lock_status = smart_home.get("дверь_замок");
10
11    println!("Свет в гостиной: {:?}", light_status);
12    println!("Замок двери: {:?}", lock_status);
13}

Поиск значений по ключу через .get()

  • Метод .get() принимает ссылку на ключ и возвращает Option<&V>.
  • Если ключ найден, возвращается Some(&value). Если ключа нет, возвращается None.
  • Это позволяет безопасно проверять наличие данных без риска паники во время работы.

Способы обработки результатов поиска
#

  1. Обработка отсутствующих ключей с помощью сопоставления с образцом (match): Поскольку .get() возвращает Option<&V>, вы можете использовать сопоставление шаблонов для детальной обработки обоих сценариев (Some и None):

    match smart_home_devices.get("гостиная_свет") {
        Some(status) => println!("Статус света: {}", status),
        None => println!("Статус света не найден"),
    }
  2. Значения по умолчанию с unwrap_or: Если вместо детальной обработки match вам достаточно подставить стандартное значение в случае отсутствия ключа, используйте метод .unwrap_or():

    let default_status = "выключен".to_string();
    let status = smart_home_devices.get("гостиная_свет").unwrap_or(&default_status);

Практический пример
#

Давайте рассмотрим практический пример, связанный с управлением умным домом. Предположим, у нас есть несколько устройств в доме и нам нужно отслеживать их текущий статус. Например, мы хотим знать, включен ли свет в гостиной, какая температура установлена на термостате в спальне и работает ли кондиционер на кухне. Если статус какого-то устройства неизвестен, мы хотим выводить соответствующее сообщение.

  • У нас есть список всех устройств, которые нас интересуют.
  • Для каждого устройства нужно вывести его название и текущий статус из HashMap, подставив значение по умолчанию для неизвестных приборов.

Давайте посмотрим, как работает этот алгоритм на практике с помощью интерактивного слайда:

Практический пример: Мониторинг умного дома
 1use std::collections::HashMap;
 2
 3fn main() {
 4    // Создаем HashMap для хранения статусов устройств
 5    let mut home_device_status: HashMap<String, String> = HashMap::new();
 6
 7    // Добавляем статусы для некоторых устройств
 8    home_device_status.insert("гостиная_свет".to_string(), "включен".to_string());
 9    home_device_status.insert("спальня_термостат".to_string(), "22°C".to_string());
10
11    // Список интересующих нас приборов
12    let devices = vec!["гостиная_свет", "спальня_термостат", "кухня_кондиционер"];
13    let default_device_status = "статус неизвестен".to_string();
14
15    // Перебираем все устройства и выводим их статус
16    for device in devices {
17        let status = home_device_status.get(device).unwrap_or(&default_device_status);
18        println!("{}: {}", device, status);
19    }
20}

Практический пример: Мониторинг умного дома

  • Мы обходим вектор интересующих нас приборов и ищем состояние каждого в HashMap.
  • Для прибора кухня_кондиционер, которого нет в мапе, метод .unwrap_or() подставляет запасное значение статус неизвестен.

Почему HashMap так полезен?
#

  • 🚀 Быстрый доступ: поиск, добавление и удаление элементов происходят за константное время O(1) в среднем.
  • 🔄 Entry API: очень лаконичный и безопасный способ условной работы с коллекцией без лишних проверок.
  • 🛡️ Безопасность типизации: компилятор Rust гарантирует, что ключи и значения будут строго соответствовать объявленным типам.

Заключение
#

HashMap предоставляет мощный способ работы с парами “ключ-значение”. Они идеально подходят для задач, требующих быстрого поиска и эффективного управления данными.

Используйте HashMap, когда:

  • Вы хотите связать произвольный ключ с произвольным значением.
  • Вам нужен кэш.
  • Вам нужна эффективная ассоциативная коллекция без сохранения порядка вставки.

Официальная документация по HashMap


Проверь свои знания!
#

Пройдите короткий интерактивный тест, чтобы закрепить понимание работы с HashMap в Rust.

История обновлений

  • Добавил примеры с кодом для демонстрации работы с коллекцией HashMap.
Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна
Цикл статей
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
12 Hash Map в Rust: полное руководство по HashMap и ключам (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Связанные статьи