Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

Все уроки раздела Logic & Flow