Acceder a los valores
Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 30 de 66.
Una vez que tengas datos almacenados en tu hash map, necesitarás una forma de recuperarlos. El método .get() te permite buscar un valor utilizando su clave:
let value = my_map.get("some_key");Sin embargo, hay un detalle importante que entender: .get() no devuelve directamente el valor. En su lugar, devuelve un tipo Option, un tipo integrado de Rust que representa si un valor está presente (Some) o ausente (None). Esto se debe a que la clave que estás buscando podría no existir en el hash map.
Cuando la clave existe, .get() devuelve Some(&value) - observa el símbolo &, lo que significa que obtienes una referencia al valor. Cuando la clave no existe, devuelve None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}En el brazo del match Some(capital), Rust maneja automáticamente la referencia por ti — capital aquí está vinculado al valor referenciado interno, por lo que no necesitas escribir & explícitamente en el patrón.
Este diseño evita que tu programa se bloquee cuando intentas acceder a una clave que no existe. En lugar de causar un error, Rust te obliga a manejar ambas posibilidades (encontrar el valor o no encontrarlo), lo que hace que tu código sea más robusto y predecible.
Desafío
FácilRecibirás dos entradas: el nombre de un país y el nombre de una ciudad capital. Crea un mapa hash que almacene nombres de países como claves (tipo String) y sus ciudades capitales como valores (tipo String). Inserta el país y su capital en el mapa hash. Luego, recibirás una tercera entrada con otro nombre de país para buscar. Utiliza el método .get() para recuperar la capital de este país y maneja ambos casos: cuando el país existe en el mapa y cuando no.
Nota: .get() devuelve un Option — ya sea Some(&value) (una referencia al valor) cuando la clave existe, o None cuando no existe. En un brazo de match, puedes escribir Some(capital) y Rust manejará automáticamente la referencia por ti, de modo que puedes usar capital directamente en tu sentencia de impresión.
Requerimientos:
- Importa
HashMapdestd::collections - Crea un mapa hash mutable con los tipos
HashMap<String, String> - Lee la primera entrada como el nombre del país
- Lee la segunda entrada como el nombre de la ciudad capital
- Inserta el país y la capital en el mapa hash
- Lee la tercera entrada como el país a buscar
- Usa
.get()para recuperar la capital del país buscado - Usa
matchpara manejar elOptiondevuelto por.get() - Si se encuentra el país, imprime:
The capital of [country] is [capital] - Si no se encuentra el país, imprime:
[country] not found in the map
Entrada:
- Primera línea: Nombre del país a insertar (por ejemplo,
France) - Segunda línea: Nombre de la ciudad capital (por ejemplo,
Paris) - Tercera línea: Nombre del país a buscar (por ejemplo,
FranceoGermany)
Salida:
- Si el país buscado existe:
The capital of [country] is [capital] - Si el país buscado no existe:
[country] not found in the map
Hoja de referencia
El método .get() recupera un valor de un hash map utilizando su clave:
let value = my_map.get("some_key");El método .get() devuelve un tipo Option porque la clave podría no existir en el hash map:
- Cuando la clave existe: devuelve
Some(&value)(una referencia al valor) - Cuando la clave no existe: devuelve
None
Usa match para manejar ambos casos:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Este diseño evita fallos al acceder a claves inexistentes al obligarte a manejar ambas posibilidades.
Pruébalo tú mismo
use std::collections::HashMap;
use std::io;
fn main() {
// Leer el nombre del país a insertar
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Leer el nombre de la ciudad capital
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Leer el nombre del país a 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: Escribe tu código abajo
// Crear un HashMap, insertar el país y la capital, luego buscar el país
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Flujo de control avanzado
La expresión 'match'Coincidencia de múltiples valoresCoincidencia de rangosLa expresión 'if let'Bucles como expresionesResumen - Analizador de comandos simple4Agrupando datos con Structs
¿Qué es un Struct?Visión general de los StructsAcceso a los campos de un StructStructs mutablesStructs como parámetros de funcionesStructs de tuplaResumen - Crear un Struct de Libro7Manejo de errores con 'Result'
¿Qué es un 'Result'?Uso de 'match' con 'Result'is_ok() e is_err()Atajos: unwrap y expectEl operador de signo de interrogación '?'Parsing de Strings a númerosResumen - Función de división segura10Closures y funciones anónimas
¿Qué es un Closure?Definir un Closure simpleClosures con parámetrosCapturar el entornoResumen - Closure sumador simple2Introducción a los vectores
¿Qué es un vector?Crear un vectorAñadir elementos con pushAcceder a los elementos de un vectorIterar sobre un vectorIteración mutableEliminar elementosResumen: Rastreador de puntuación básico5Pares clave-valor con Hash Maps
¿Qué es un Hash Map?Crear un Hash MapInsertar pares clave-valorAcceder a los valoresIterar sobre un Hash MapActualizar un valorEliminar un parRepaso: Contador de palabras8Proyecto: Inventario simple de artículos
Configuración del proyectoAgregar un artículoVerificar el stockVender un artículoUniendo todo3Lista de tareas en la línea de comandos
Configuración del proyectoAñadir una tareaVer todas las tareasEliminar una tareaCódigo final