AnyCompiler

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);
    }
}
Output
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"));
}
Output
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"].

← Tratamento de ErrosMais lições em breve