Доступ к значениям
Часть раздела Логика и управление потоком путешествия по 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"),
}Вы можете заметить, что ветвь сопоставления использует Some(capital) без явного &. Это происходит потому, что Rust автоматически обрабатывает ссылку в этом контексте: capital по-прежнему содержит ссылку на значение, но вам не нужно явно записывать & в шаблоне. Сопоставление с шаблоном в Rust достаточно умное, чтобы позволить вам напрямую использовать capital, например при его выводе.
Этот подход не позволяет вашей программе аварийно завершить работу, когда вы пытаетесь получить доступ к несуществующему ключу. Вместо того чтобы вызывать ошибку, Rust заставляет вас обработать обе возможности — найти значение или не найти его, — благодаря чему ваш код становится более надёжным и предсказуемым.
Задание
ЛегкоТы получишь два входных значения: имя country и название capital city. Создай хеш-таблицу, которая хранит имена country в качестве ключей (тип String), а их capital cities — в качестве значений (тип String). Вставь country и его capital в хеш-таблицу. Затем ты получишь третье входное значение с именем другой country для поиска. Используй метод .get(), чтобы получить capital этой country, и обработай оба случая: когда country существует в таблице и когда её там нет.
Примечание: .get() возвращает Option: либо Some(&value) (ссылку на значение), когда ключ существует, либо None, когда его нет. В ветви match можно написать Some(capital), и Rust автоматически обработает ссылку, поэтому ты можешь напрямую использовать capital в операторе вывода.
Требования:
- Импортируй
HashMapизstd::collections - Создай изменяемую хеш-таблицу с типами
HashMap<String, String> - Прочитай первое входное значение как имя country
- Прочитай второе входное значение как название capital city
- Вставь country и capital в хеш-таблицу
- Прочитай третье входное значение как country для поиска
- Используй
.get(), чтобы получить capital для искомой country - Используй
matchдля обработкиOption, возвращённого методом.get() - Если country найдена, выведи:
The capital of [country] is [capital] - Если country не найдена, выведи:
[country] not found in the map
Ввод:
- Первая строка: имя country для вставки (например,
France) - Вторая строка: название capital city (например,
Paris) - Третья строка: имя country для поиска (например,
FranceилиGermany)
Вывод:
- Если искомая country существует:
The capital of [country] is [capital] - Если искомая country не существует:
[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, вставьте страну и столицу, затем найдите страну
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Итоги: поиск элементаПотренируйтесь самостоятельно: Онлайн-компилятор Rust