Доступ к значениям
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 30 из 66.
Как только данные будут сохранены в вашей хэш-карте, вам понадобится способ их извлечения. Метод .get() позволяет искать значение по его ключу:
let value = my_map.get("some_key");Однако есть важная деталь, которую необходимо понять: .get() не возвращает значение напрямую. Вместо этого он возвращает тип Option — встроенный тип Rust, который представляет либо «что-то», либо «ничего». Это связано с тем, что искомый ключ может отсутствовать в хеш-карте.
Когда ключ существует, .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 достаточно интеллектуально, чтобы позволить вам использовать 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
Попробуйте сами
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Итоги: поиск элемента