Acessando Valores
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 30 de 66.
Depois de armazenar dados em seu hash map, você precisará de uma maneira de recuperá-los. O método .get() permite que você procure um valor usando sua chave:
let value = my_map.get("some_key");No entanto, há um detalhe importante a entender: .get() não retorna o valor diretamente. Em vez disso, ele retorna um tipo Option — um tipo nativo do Rust que representa ou a presença de um valor (Some) ou a ausência (None). Isso ocorre porque a chave que você está procurando pode não existir no hash map.
Quando a chave existe, .get() retorna Some(&value) — observe o símbolo &, o que significa que você obtém uma referência para o valor. Quando a chave não existe, ele retorna None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}No braço de correspondência Some(capital), o Rust lida automaticamente com a referência para você — capital aqui está vinculado ao valor referenciado interno, então você não precisa escrever & explicitamente no padrão.
Este design evita que seu programa trave quando você tenta acessar uma chave que não existe. Em vez de causar um erro, o Rust força 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: o nome de um país e o nome de uma capital. Crie um hash map que armazene nomes de países como chaves (tipo String) e suas capitais como valores (tipo String). Insira o país e sua capital no hash map. Em seguida, você receberá uma terceira entrada com outro nome de país para pesquisar. Use o método .get() para recuperar a capital deste país e trate ambos os casos: quando o país existe no mapa e quando não existe.
Nota: .get() retorna um Option — ou Some(&value) (uma referência ao valor) quando a chave existe, ou None quando não existe. Em um braço match, você pode escrever Some(capital) e o Rust lidará automaticamente com a referência para você, para que você possa usar capital diretamente em sua instrução de impressão.
Requisitos:
- Importe
HashMapdestd::collections - Crie um hash map mutável com os tipos
HashMap<String, String> - Leia a primeira entrada como o nome do país
- Leia a segunda entrada como o nome da capital
- Insira o país e a capital no hash map
- Leia a terceira entrada como o país a ser pesquisado
- Use
.get()para recuperar a capital para o país pesquisado - Use
matchpara tratar oOptionretornado por.get() - Se o país for encontrado, imprima:
The capital of [country] is [capital] - Se o país não for encontrado, imprima:
[country] not found in the map
Entrada:
- Primeira linha: Nome do país a inserir (ex:
France) - Segunda linha: Nome da capital (ex:
Paris) - Terceira linha: Nome do país a pesquisar (ex:
FranceouGermany)
Saída:
- Se o país pesquisado existir:
The capital of [country] is [capital] - Se o país pesquisado não existir:
[country] not found in the map
Folha de consulta
O método .get() recupera um valor de um hash map usando sua chave:
let value = my_map.get("some_key");O método .get() retorna um tipo Option porque a chave pode não existir no hash map:
- Quando a chave existe: retorna
Some(&value)(uma referência ao valor) - Quando a chave não existe: retorna
None
Use match para lidar com ambos os casos:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Este design evita falhas ao acessar chaves inexistentes, forçando você a lidar com ambas as possibilidades.
Experimente você mesmo
use std::collections::HashMap;
use std::io;
fn main() {
// Ler o nome do país para inserir
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Ler o nome da capital
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Ler o nome do país para buscar
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
// Criar um HashMap, inserir o país e a capital, e então buscar 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 Logic & Flow
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 Final