Rullst AcademyRullst Academy/Lição
Rust II: dados, escolhas e confiança · Lição 07 / 12

Um mapa para cada nome

Contar equipamentos por nome é diferente de consultá-los por posição. Um HashMap relaciona cada chave a um valor.

Trilhas de aprendizado12 min

Vamos descobrir juntos

  1. 1

    use std::collections::HashMap traz o nome do tipo para o escopo. HashMap<String, u16> relaciona nomes possuídos a quantidades. get consulta uma chave e pode retornar None.

  2. 2

    entry(key).or_insert(0) devolve uma referência mutável ao valor existente ou insere zero se faltar. *count += 1 altera o valor apontado por essa referência.

  3. 3

    insert em uma chave existente substitui seu valor; não soma automaticamente. Aqui usamos entry justamente para acumular. O pequeno conjunto fixo não ameaça o limite de u16.

  4. 4

    A ordem de iteração de HashMap não é garantida. Uma interface ou teste com ordem estável precisa ordenar as chaves, usar BTreeMap ou preservar uma sequência separada. Aqui consultamos apenas sensor.

DA LIÇÃO PARA A PRÁTICA

Guia para acompanhar no seu ritmo

Leia os passos antes de usar a referência abaixo. Comandos são executados no terminal do sistema indicado; o cadastro acontece no site oficial. Os exercícios da Rullst Academy são treino e não verificam sua instalação ou conta externa.

use std::collections::HashMap;
fn main() {
    let mut counts = HashMap::new();
    for name in ["sensor", "sensor", "motor", "sensor"] {
        let count = counts.entry(String::from(name)).or_insert(0_u16);
        *count += 1;
    }
    println!("{}", counts["sensor"]);
}

Links oficiais e próximo passo

✦
SUA MISSÃO

Acumular contagens com HashMap e não depender da ordem de iteração.

Agora é a sua vez

Oficina de descobertas

Leia, preveja, investigue

Preveja antes de mostrar. Este painel revela resultados preparados, não compila seu código. Erros de compilação são resumidos; o texto exato pode variar com a versão do compilador.
Mini experimento

Simulação didática: compare os cartões e confira suas previsões. O navegador não está compilando Rust nem iniciando um servidor.

use std::collections::HashMap;
fn main() {
    let mut counts = HashMap::new();
    for name in ["sensor", "sensor", "motor", "sensor"] {
        let count = counts.entry(String::from(name)).or_insert(0_u16);
        *count += 1;
    }
    println!("{}", counts["sensor"]);
}
Monte suas respostas e confira quando estiver pronto.
Uma pausa para entender

Como obter uma lista em ordem previsível?

Preciso de uma pista

Uma ordem observada não é um contrato de HashMap.

Carregando sua jornada…

Leve com você

Acrescente motor e conte separadamente. Depois substitua o acumulador por insert(name, 1), observe o defeito e escreva um teste que o detecte.

RUST II · .rs

Sua bancada Rust II

Leia, preveja e responda aqui. Para compilar de verdade, extraia o ZIP da atividade em uma pasta nova, abra o terminal ao lado de Cargo.toml e use os comandos abaixo. Rust e as ferramentas do seu sistema precisam estar instalados.

cargo check --offline
cargo test --offline
cargo run --offline
Meus arquivos e GitHub

O editor abaixo salva um rascunho neste navegador e permite baixar ou publicar seu .rs. Para executá-lo no projeto, salve o arquivo editado como src/main.rs. O ZIP contém a versão inicial; os resultados preparados não mudam com suas edições. A avaliação online não comprova execução local.

No seu ritmo

Meus arquivos e GitHub

Toda lição pode virar um registro seu: código, anotações ou um plano de prática. Guardar um arquivo no GitHub é opcional e não altera seu XP.

Manual do aluno

O editor e os downloads abrem quando esta lição estiver liberada para sua conta. Confira o acesso abaixo ou volte ao mapa da trilha.

Conferindo seu acesso à lição…

Rullstpetbot

A IA pode errar. Confira no material da lição.