Collections e a Biblioteca Padrão
HashMap<K, V> armazena pares chave-valor, assim como um dictionary em Python ou um object em JavaScript — mas com os tipos de chave e valor fixados de antemão. Indexar com [] causa um panic se a chave estiver faltando, enquanto .get() retorna um Option, permitindo que você trate uma chave ausente sem travar.
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
A API entry
entry().or_insert() é a forma idiomática do Rust de atualizar-ou-inserir em um único passo: ele retorna uma referência mutável ao valor, inserindo um padrão primeiro se a chave ainda não estava lá. contains_key verifica a presença de uma chave sem precisar tratar um Option.
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
Essa é a base do Rust: ownership, borrowing, e um sistema de tipos que transforma categorias inteiras de bugs em erros de compilação em vez de surpresas em tempo de execução. A partir daqui, o melhor próximo passo é praticar — escolha um programa pequeno e construa-o, apoiando-se nas mensagens de erro do compilador, que estão entre as melhores da indústria, para te guiar.
Practice Exercise
Crie um HashMap<&str, i32> chamado ages. Insira "Alice" -> 30 e "Bob" -> 25. Imprima ages["Alice"].