Historia de la pregunta
Las colecciones HashSet y HashMap son estructuras estándar de std::collections que implementan una búsqueda rápida por hash. Están integradas en Rust desde las primeras versiones del lenguaje, pero los detalles internos de su uso a menudo causan dificultades incluso a desarrolladores experimentados debido al sistema de propiedad.
Problema
La confusión surge al insertar y extraer elementos (especialmente si los valores no son Copy), al modificar la colección (prestamos mutables), así como al usar referencias como claves. También hay problemas con la implementación correcta de Eq/Hash para tipos personalizados.
Solución
Ejemplo de código:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("key", 42); if let Some(value) = map.get("key") { println!("Encontrado valor: {}", value); } }
Características clave:
¿Se puede obtener múltiples referencias mutables a un mismo elemento de HashMap?
No, el verificador de préstamos no lo permitirá para evitar violaciones de propiedad.
¿Se puede usar un literal de cadena "abc" directamente como clave en HashMap<String, V>?
No, se espera exactamente un String, mientras que "abc" es &'static str. Se necesita conversión: insert("abc".to_string(), val).
¿Se puede extraer un valor de HashMap, almacenándolo en una variable separada y seguir usando HashMap?
Sí, se puede obtener una referencia al valor a través de get, pero si se hace remove (o se extrae por move), HashMap se muta, y cualquier referencia anterior se vuelve no válida.
Intentar tomar prestados simultáneamente tanto la clave como el valor, y luego mutar la colección:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); let val = map.get("abc"); map.insert("def".to_string(), 20); // error del verificador de préstamos
Ventajas:
Desventajas:
Extracción de un valor, trabajando solo con su copia o clon:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); if let Some(val) = map.get("abc") { let val = *val; // copiamos map.insert("def".to_string(), 20); // todo funciona }
Ventajas:
Desventajas: