Menu
Coddy logo textTech

Доступ к значениям

Часть раздела Логика и управление потоком путешествия по 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 заставляет вас обработать обе возможности — найти значение или не найти его, — благодаря чему ваш код становится более надёжным и предсказуемым.

challenge icon

Задание

Легко

Ты получишь два входных значения: имя 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, вставьте страну и столицу, затем найдите страну
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Rust