Acessando Valores
Parte da seção Lógica & Fluxo do Journey de Rust da Coddy. Lição 30 de 66.
Depois de armazenar dados no seu mapa de hash, você precisará de uma maneira de recuperá-los. O método .get() permite procurar um valor usando sua chave:
let value = my_map.get("some_key");No entanto, há um detalhe importante a entender: .get() não retorna diretamente o valor. Em vez disso, ele retorna um tipo Option: um tipo integrado do Rust que representa "algo" ou "nada". Isso ocorre porque a chave que você está procurando pode não existir no mapa hash.
Quando a chave existe, .get() retorna Some(&value) — observe o símbolo &, que significa que você obtém uma referência ao valor, não o valor em si. Quando a chave não existe, retorna None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Você pode notar que o braço de match usa Some(capital) sem um & explícito. Isso acontece porque o Rust lida automaticamente com a referência para você nesse contexto: capital ainda contém uma referência ao valor, mas você não precisa escrever & explicitamente no padrão. A correspondência de padrões do Rust é inteligente o suficiente para permitir que você use capital diretamente, por exemplo, ao imprimi-lo.
Este design impede que seu programa trave quando você tenta acessar uma chave que não existe. Em vez de causar um erro, Rust obriga você a lidar com ambas as possibilidades — encontrar o valor ou não encontrá-lo — tornando seu código mais robusto e previsível.
Desafio
FácilVocê receberá duas entradas: um nome de country e um nome de capital city. Crie um mapa hash que armazene nomes de country como chaves (tipo String) e suas capital city como valores (tipo String). Insira o country e sua capital no mapa hash. Em seguida, você receberá uma terceira entrada com o nome de outro country para pesquisar. Use o método .get() para recuperar a capital desse country e trate ambos os casos: quando o country existe no mapa e quando não existe.
Observação: .get() retorna um Option, seja Some(&value) (uma referência ao valor) quando a chave existe, ou None quando não existe. Em um braço de match, você pode escrever Some(capital) e o Rust tratará automaticamente a referência para você, permitindo usar capital diretamente na instrução de impressão.
Requisitos:
- Importe
HashMapdestd::collections - Crie um mapa hash mutável com os tipos
HashMap<String, String> - Leia a primeira entrada como o nome do
country - Leia a segunda entrada como o nome da
capitalcity - Insira o
countrye acapitalno mapa hash - Leia a terceira entrada como o
countrya ser pesquisado - Use
.get()para recuperar acapitaldocountrypesquisado - Use
matchpara tratar oOptionretornado por.get() - Se o
countryfor encontrado, imprima:The capital of [country] is [capital] - Se o
countrynão for encontrado, imprima:[country] not found in the map
Entrada:
- Primeira linha: nome do
Countrya inserir (por exemplo,France) - Segunda linha: nome da
capitalcity(por exemplo,Paris) - Terceira linha: nome do
Countrya pesquisar (por exemplo,FranceouGermany)
Saída:
- Se o
countrypesquisado existir:The capital of [country] is [capital] - Se o
countrypesquisado não existir:[country] not found in the map
Experimente você mesmo
use std::collections::HashMap;
use std::io;
fn main() {
// Leia o nome do país a inserir
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Leia o nome da cidade capital
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Leia o nome do país a consultar
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: Escreva seu código abaixo
// Crie um HashMap, insira o país e a capital, depois consulte o país
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo FinalPratique por conta própria: Compilador de Rust online