Acceder a los valores
Parte de la sección Lógica y Flujo del Journey de Rust de Coddy. Lección 30 de 66.
Una vez que tengas datos almacenados en tu mapa hash, necesitarás una forma de recuperarlos. El método .get() te permite buscar un valor usando su clave:
let value = my_map.get("some_key");Sin embargo, hay un detalle importante que debes entender: .get() no devuelve directamente el valor. En su lugar, devuelve un tipo Option: un tipo integrado de Rust que representa “algo” o “nada”. Esto se debe a que es posible que la clave que buscas no exista en el mapa hash.
Cuando existe la clave, .get() devuelve Some(&value); observa el símbolo &, que significa que obtienes una referencia al valor, no el valor en sí. Cuando la clave no existe, devuelve None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Quizás notes que el brazo de coincidencia usa Some(capital) sin un & explícito. Esto se debe a que Rust gestiona automáticamente la referencia por ti en este contexto: capital todavía contiene una referencia al valor, pero no necesitas escribir & explícitamente en el patrón. La coincidencia de patrones de Rust es lo suficientemente inteligente como para permitirte usar capital directamente, por ejemplo, al imprimirlo.
Este diseño evita que tu programa se bloquee cuando intentas acceder a una clave que no existe. En lugar de provocar un error, Rust te obliga a gestionar ambas posibilidades: encontrar el valor o no encontrarlo, lo que hace que tu código sea más sólido 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 los nombres de los 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. Después, recibirás una tercera entrada con el nombre de otro país que deberás buscar. Usa el método .get() para recuperar la capital de este país y gestiona ambos casos: cuando el país existe en el mapa y cuando no existe.
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 gestionará automáticamente la referencia, por lo que puedes usar capital directamente en tu instrucción de impresión.
Requisitos:
- Importa
HashMapdesdestd::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 que se buscará
- Usa
.get()para recuperar la capital del país buscado - Usa
matchpara gestionar 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 que se insertará (por ejemplo,
France) - Segunda línea: nombre de la ciudad capital (por ejemplo,
Paris) - Tercera línea: nombre del país que se 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
Pruébalo tú mismo
use std::collections::HashMap;
use std::io;
fn main() {
// Lee 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();
// Lee 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();
// Lee 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 debajo
// Crea un HashMap, inserta el país y la capital, luego busca el país
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
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 finalPractica por tu cuenta: Compilador de Rust online