HashMaps
Хранилище пар «ключ — значение»
«HashMaps» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое HashMap
HashMap<K, V> хранит пары ключ-значение. Значения ищутся по ключу, а не по позиции.
Его необходимо импортировать из стандартной библиотеки.
use std::collections::HashMap;
fn main() {
let map: HashMap<String, i32> = HashMap::new();
println!("{} entries", map.len());
}Импорт HashMap
HashMap не входит в прелюдию, поэтому добавьте эту строку в начало файла:
use std::collections::HashMap;
use std::collections::HashMap;
fn main() {
let scores: HashMap<&str, i32> = HashMap::new();
println!("empty: {}", scores.is_empty());
}Добавление пар
Добавляйте записи с помощью insert, указывая ключ и значение. Карта должна иметь тип mut.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 90);
scores.insert("Bob", 85);
println!("{:?}", scores);
}Поиск значений
Используйте get, чтобы прочитать значение по ключу. Он возвращает Option — Some(value), если значение найдено, и None в противном случае.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 90);
match scores.get("Alice") {
Some(s) => println!("score {}", s),
None => println!("not found"),
}
}Обновление значения
Вызов insert с уже существующим ключом заменяет старое значение.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("count", 1);
map.insert("count", 5); // overwrites
println!("{:?}", map.get("count"));
}Добавление только отсутствующих ключей
API entry вместе с or_insert добавляет значение по умолчанию, только если ключ отсутствует.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.entry("x").or_insert(10);
map.entry("x").or_insert(99); // ignored, key exists
println!("{:?}", map.get("x"));
}Подсчёт с помощью entry
Классический шаблон: получить изменяемую ссылку с помощью or_insert и увеличить значение.
use std::collections::HashMap;
fn main() {
let text = "a b a c b a";
let mut counts = HashMap::new();
for word in text.split_whitespace() {
let c = counts.entry(word).or_insert(0);
*c += 1;
}
println!("{:?}", counts);
}Перебор записей
Перебирайте HashMap, чтобы посетить каждую пару ключ-значение. Порядок не гарантируется.
use std::collections::HashMap;
fn main() {
let mut ages = HashMap::new();
ages.insert("Tom", 30);
ages.insert("Sue", 25);
for (name, age) in &ages {
println!("{} is {}", name, age);
}
}Удаление записей
Удаляйте пару с помощью remove. Метод возвращает удалённое значение как Option.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("key", 42);
let removed = map.remove("key");
println!("removed {:?}, len {}", removed, map.len());
}Проверка наличия ключа
Используйте contains_key, чтобы проверить наличие ключа, не извлекая его значение.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("on", true);
println!("{}", map.contains_key("on"));
println!("{}", map.contains_key("off"));
}Значение по умолчанию с unwrap_or
При чтении вместо сопоставления с Option можно указать запасное значение с помощью unwrap_or.
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("a", 1);
let value = map.get("missing").unwrap_or(&0);
println!("{}", value);
}Быстрая проверка
Вспомните, как работает поиск в HashMap.
Повторение
HashMaps в Rust:
HashMap<K, V>хранит пары ключ-значение; его нужно импортировать изstd::collections.insertдобавляет или заменяет значение, аgetвозвращает Option.entry().or_insert()добавляет значение, только если ключ отсутствует.- Перебор выполняется с помощью
for (k, v) in &map.
use std::collections::HashMap;
fn main() {
let mut inventory = HashMap::new();
inventory.insert("apples", 3);
*inventory.entry("apples").or_insert(0) += 2;
println!("{:?}", inventory.get("apples"));
}Часто задаваемые вопросы
Урок «HashMaps» бесплатный?
Да — полный текст урока «HashMaps» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «HashMaps»?
Хранилище пар «ключ — значение» Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «HashMaps»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.