Доступ к значениям
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 30 из 66.
Как только вы сохраните данные в своей хэш-карте, вам понадобится способ их извлечения. Метод .get() позволяет искать значение по его ключу:
let value = my_map.get("some_key");Однако есть важная деталь, которую необходимо понять: .get() не возвращает значение напрямую. Вместо этого он возвращает тип Option — встроенный тип Rust, который представляет либо наличие значения (Some), либо его отсутствие (None). Это связано с тем, что искомый ключ может отсутствовать в хеш-карте.
Когда ключ существует, .get() возвращает Some(&value) — обратите внимание на символ &, который означает, что вы получаете ссылку на значение. Когда ключ не существует, он возвращает None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}В ветке match Some(capital) Rust автоматически обрабатывает ссылку за вас — capital здесь привязан к внутреннему значению, на которое указывает ссылка, поэтому вам не нужно явно писать & в шаблоне.
Такой подход предотвращает аварийное завершение программы при попытке доступа к несуществующему ключу. Вместо того чтобы вызывать ошибку, Rust заставляет вас обрабатывать обе возможности — нахождение значения или его отсутствие — что делает ваш код более надежным и предсказуемым.
Задание
ЛегкоВы получите два входных значения: название страны и название столицы. Создайте хеш-карту (hash map), которая хранит названия стран в качестве ключей (тип String) и их столицы в качестве значений (тип String). Вставьте страну и её столицу в хеш-карту. Затем вы получите третье входное значение с названием другой страны для поиска. Используйте метод .get(), чтобы извлечь столицу для этой страны, и обработайте оба случая: когда страна существует в карте и когда её нет.
Примечание: .get() возвращает Option — либо Some(&value) (ссылку на значение), когда ключ существует, либо None, когда его нет. В ветке match вы можете написать Some(capital), и Rust автоматически обработает ссылку за вас, так что вы сможете использовать capital напрямую в инструкции печати.
Требования:
- Импортируйте
HashMapизstd::collections - Создайте изменяемую хеш-карту с типами
HashMap<String, String> - Прочитайте первый ввод как название страны
- Прочитайте второй ввод как название столицы
- Вставьте страну и столицу в хеш-карту
- Прочитайте третий ввод как страну для поиска
- Используйте
.get()для получения столицы искомой страны - Используйте
matchдля обработкиOption, возвращаемого методом.get() - Если страна найдена, выведите:
The capital of [country] is [capital] - Если страна не найдена, выведите:
[country] not found in the map
Ввод:
- Первая строка: Название страны для вставки (например,
France) - Вторая строка: Название столицы (например,
Paris) - Третья строка: Название страны для поиска (например,
FranceилиGermany)
Вывод:
- Если искомая страна существует:
The capital of [country] is [capital] - Если искомая страна не существует:
[country] not found in the map
Шпаргалка
Метод .get() извлекает значение из хеш-карты по его ключу:
let value = my_map.get("some_key");Метод .get() возвращает тип Option, потому что ключ может отсутствовать в хеш-карте:
- Когда ключ существует: возвращает
Some(&value)(ссылку на значение) - Когда ключ не существует: возвращает
None
Используйте match для обработки обоих случаев:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Такой подход предотвращает сбои при обращении к несуществующим ключам, заставляя вас обрабатывать обе возможности.
Попробуйте сами
use std::collections::HashMap;
use std::io;
fn main() {
// Считать название страны для вставки
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Считать название столицы
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Считать название страны для поиска
let mut lookup_country = String::new();
io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
let lookup_country = lookup_country.trim().to_string();
// TODO: Напишите свой код ниже
// Создайте HashMap, вставьте страну и столицу, затем выполните поиск страны
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента