Создание HashMap
Вставляйте значения и находите их по ключу.
«Создание HashMap» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое HashMap
HashMap хранит данные в виде пар «ключ—значение». Поиск выполняется по ключу, а не по индексу.
Представьте телефонную книгу: имя (ключ) сопоставляется с номером (значением). HashMaps идеально подходят, когда нужен быстрый поиск по осмысленному ключу.
Импорт HashMap
В отличие от Vec и String, HashMap не входит в прелюдию. Его нужно добавить в область видимости.
Добавьте строку use в начале файла. После этого имя будет доступно во всём модуле.
use std::collections::HashMap;
fn main() {
let scores: HashMap<String, i32> = HashMap::new();
println!("empty map len: {}", scores.len());
}Вставка пар
Используйте insert, чтобы добавить ключ и его значение. Если ключ уже существует, старое значение заменяется.
Чтобы разрешить вставку, карта должна быть объявлена как mut.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 50);
scores.insert("Bob", 30);
println!("{} players", scores.len());
}Вывод типа
Обычно тип указывать не нужно. Rust выводит HashMap<&str, i32> по первым вызовам insert.
Здесь ключами являются строковые срезы, а значениями — целые числа; всё это определяется по использованию.
use std::collections::HashMap;
fn main() {
let mut ages = HashMap::new();
ages.insert("Sam", 28);
ages.insert("Mia", 34);
println!("Sam is {}", ages["Sam"]);
}Получение значений
Метод get возвращает Option. Если ключ существует, вы получаете Some(&value), а если нет — None.
Это заставляет безопасно обрабатывать случай отсутствующего ключа.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert("Alice", 50);
match scores.get("Alice") {
Some(v) => println!("score: {}", v),
None => println!("no score"),
}
}Индексация и get
Можно использовать индексацию map[key], но при отсутствии ключа она вызывает панику.
Предпочитайте get, если ключ может отсутствовать. Используйте индексацию только тогда, когда уверены, что ключ существует.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("x", 1);
// m["y"] would panic!
let v = m.get("y").copied().unwrap_or(0);
println!("y = {}", v);
}Обновление значения
Вызов insert с уже существующим ключом перезаписывает старое значение.
Предыдущее значение возвращается в Option, поэтому при необходимости его можно проверить.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("k", 1);
let old = m.insert("k", 9);
println!("old = {:?}, now = {}", old, m["k"]);
}Проверка ключей
Используйте contains_key, чтобы проверить существование ключа, не получая его значение.
Метод возвращает обычное значение bool, что удобно использовать в условиях if.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("on", true);
if m.contains_key("on") {
println!("key exists");
}
}Удаление записей
Метод remove удаляет ключ и возвращает его значение в виде Option.
Если ключ отсутствовал, вы получаете None, поэтому удаление всегда безопасно.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("a", 1);
let removed = m.remove("a");
println!("removed {:?}, len {}", removed, m.len());
}Перебор карты
Цикл for по HashMap выдаёт кортежи (key, value) по ссылке.
Порядок не определён и может меняться между запусками, поскольку хеширование перемешивает расположение элементов.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("a", 1);
m.insert("b", 2);
for (k, v) in &m {
println!("{} -> {}", k, v);
}
}Владение ключами
При вставке принадлежащих вызывающему коду значений, например String, карта получает право владения ими.
После вставки переменную нельзя использовать снова, если предварительно не создать её копию.
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
let name = String::from("Alice");
m.insert(name, 50);
// name is moved here; m owns it now
println!("{}", m["Alice"]);
}Быстрая проверка
Вам нужно значение, но ключ может отсутствовать.
Повторение
Вы научились создавать HashMap, вставлять пары и получать значения с помощью get или индексации.
Вы также познакомились с contains_key, remove, итерацией и тем, как карта получает право владения вставленными ключами.
Часто задаваемые вопросы
Урок «Создание HashMap» бесплатный?
Да — полный текст урока «Создание HashMap» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Создание HashMap»?
Вставляйте значения и находите их по ключу. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Создание HashMap»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.