No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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
- Implementar
criar_arsenalretornandoVec::new() - Implementar
carregar_arsenalusandoiter().map(|s| s.to_string()).collect::<Vec<String>>()— note queVec::from(&[&str])e&[&str].to_vec()produziriamVec<&str>, nãoVec<String> - Implementar
adicionar_armausando.push() - Implementar
remover_armausando.pop() - Implementar
contar_armasusando.len() - Implementar
obter_armausando.get()com retornoOption<&String> - Implementar
listar_arsenaliterando com.enumerate() - Implementar
descartar_armausando.remove() - Implementar
tem_armausando.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)retornaOption<&T>— seguro contra índices inválidosarsenal[i]entra em pânico se o índice estiver fora dos limites