No description
Find a file
2026-09-01 13:30:47 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:30:47 +02:00
src fix(022): pedagogical MINOR fixes 2026-09-01 13:30:47 +02:00
tests initial content 2026-09-01 13:30:45 +02:00
.gitignore Initial commit 2026-09-01 11:30:27 +00:00
Cargo.lock initial content 2026-09-01 13:30:45 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:30:47 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:30:47 +02:00
README.md fix(022): pedagogical MINOR fixes 2026-09-01 13:30:47 +02:00

Lição 22: Arsenal Dinâmico (Vec)

1. Narrativa

O mecha Æther carrega um arsenal de armas e equipamentos que muda a cada missão. O piloto precisa adicionar, remover e acessar itens dinamicamente — o loadout nunca é fixo. Vec é a coleção dinâmica que cresce e encolhe conforme o piloto adapta seu equipamento para cada combate.

2. Conceito

Vec (vetor) é a coleção mais usada em Rust — uma lista dinâmica na heap. Principais operações:

  • Criação: Vec::new(), iter().map(|s| s.to_string()).collect() — inicializar o arsenal
  • Inserção: .push() — adicionar item ao final
  • Remoção: .pop(), .remove() — extrair itens do final ou por índice
  • Acesso: .get(), [i] — consultar itens com segurança ou pânico
  • Consulta: .len(), .contains() — informações sobre o arsenal

3. Requisitos

  • Criar e manipular vetores de strings representando armas
  • Usar .push(), .pop(), .remove() para modificar o arsenal
  • Usar .get() para acesso seguro e .len() para contagem
  • Formatar relatórios iterando sobre o vetor

4. Design de Dados

graph LR
    A[Vec::new] --> B[push: Canhão Plasma]
    B --> C[push: Míssil Guiado]
    C --> D[push: Laser de Pulso]
    D --> E[get índice 0]
    D --> F[pop último]
    D --> G[contains Míssil]

5. Diagrama de Fluxo

flowchart TD
    A[Início] --> B[Criar arsenal vazio]
    B --> C[Adicionar armas via push]
    C --> D{Precisa remover?}
    D -->|Sim| E[pop ou remove]
    D -->|Não| F[Consultar arsenal]
    E --> F
    F --> G[Gerar relatório]
    G --> H[Fim]

6. Funções

Função Descrição
criar_arsenal Cria um Vec vazio
carregar_arsenal Cria Vec a partir de slice de &str
adicionar_arma Adiciona arma ao final com .push()
remover_arma Remove e retorna a última arma com .pop()
contar_armas Conta itens com .len()
obter_arma Acesso seguro por índice com .get()
listar_arsenal Formata relatório com índice e nome
descartar_arma Remove por índice com .remove()
tem_arma Verifica existência com .contains()

7. Exemplo

let mut arsenal: Vec<String> = Vec::new();
arsenal.push("Canhão de Plasma".to_string());
arsenal.push("Míssil Guiado".to_string());
assert_eq!(arsenal.len(), 2);
assert!(arsenal.contains(&"Canhão de Plasma".to_string()));
let ultima = arsenal.pop();
assert_eq!(ultima, Some("Míssil Guiado".to_string()));

8. Missão

  1. Implementar criar_arsenal retornando Vec::new()
  2. Implementar carregar_arsenal usando iter().map(|s| s.to_string()).collect::<Vec<String>>() — note que Vec::from(&[&str]) e &[&str].to_vec() produziriam Vec<&str>, não Vec<String>
  3. Implementar adicionar_arma usando .push()
  4. Implementar remover_arma usando .pop()
  5. Implementar contar_armas usando .len()
  6. Implementar obter_arma usando .get() com retorno Option<&String>
  7. Implementar listar_arsenal iterando com .enumerate()
  8. Implementar descartar_arma usando .remove()
  9. Implementar tem_arma usando .contains()

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • .push() adiciona ao final, .pop() remove do final — ambas são O(1)
  • .remove(i) é O(n) porque desloca todos os itens após o índice
  • .get(i) retorna Option<&T> — seguro contra índices inválidos
  • arsenal[i] entra em pânico se o índice estiver fora dos limites