Collections y la Librería Estándar
HashMap<K, V> almacena pares clave-valor, igual que un dictionary en Python o un object en JavaScript — pero con los tipos de clave y valor fijados de antemano. Indexar con [] produce un panic si falta la clave, mientras que .get() devuelve un Option, lo que te permite manejar una clave faltante sin que el programa falle.
use std::collections::HashMap;
fn main() {
let mut scores: HashMap<String, i32> = HashMap::new();
scores.insert(String::from("Alice"), 95);
scores.insert(String::from("Bob"), 87);
println!("{}", scores["Alice"]);
if let Some(score) = scores.get("Bob") {
println!("Bob: {}", score);
}
}95 Bob: 87
La API entry
entry().or_insert() es la forma idiomática que tiene Rust de actualizar-o-insertar en un solo paso: devuelve una referencia mutable al valor, insertando primero un valor por defecto si la clave no estaba ya ahí. contains_key comprueba la presencia de una clave sin necesidad de manejar un Option en absoluto.
use std::collections::HashMap;
fn main() {
let mut inventory: HashMap<&str, i32> = HashMap::new();
inventory.insert("apples", 10);
inventory.insert("bananas", 5);
*inventory.entry("apples").or_insert(0) += 3;
println!("apples: {}", inventory["apples"]);
println!("has oranges: {}", inventory.contains_key("oranges"));
}apples: 13 has oranges: false
Esa es la base de Rust: ownership, borrowing, y un sistema de tipos que convierte categorías enteras de errores en errores de compilación en vez de sorpresas en tiempo de ejecución. A partir de aquí, el mejor siguiente paso es practicar — elige un programa pequeño y constrúyelo, apoyándote en los mensajes de error del compilador, que están entre los mejores de la industria, para guiarte.
Practice Exercise
Crea un HashMap<&str, i32> llamado ages. Inserta "Alice" -> 30 y "Bob" -> 25. Imprime ages["Alice"].