Aula 07 - Strings e Coleções 🧵
Objetivo
Objetivo: Dominar as principais coleções de dados do Rust, entendendo a diferença entre os tipos de texto e como armazenar listas e mapas com eficiência.
1. O Mundo das Strings 🔤
No Rust, "string" geralmente se refere a dois tipos principais:
- String: Alocada na Heap, mutável, crescível. Você é o dono dela.
- &str (String Slice): Uma referência a uma sequência de caracteres UTF-8. Imutável.
Convertendo e Manipulando
let mut s = String::from("Olá"); // String
let slice: &str = " mundo"; // &str
s.push_str(slice); // Adiciona o slice à String
println!("{}", s);
2. Vetores: Vec<T> 📦
Um vetor permite armazenar mais de um valor em uma única estrutura de dados, um ao lado do outro na memória.
let mut v: Vec<i32> = Vec::new();
v.push(10);
v.push(20);
// Forma mais comum usando a macro vec!
let v2 = vec![1, 2, 3];
// Lendo elementos
match v.get(1) {
Some(valor) => println!("O segundo elemento é {}", valor),
None => println!("Não há segundo elemento."),
}
3. Mapas de Hash: HashMap<K, V> 🗺️
Armazena um mapeamento de chaves para valores. Útil para buscas rápidas.
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Azul"), 10);
scores.insert(String::from("Amarelo"), 50);
// Acessando valores
let time = String::from("Azul");
let score = scores.get(&time); // Retorna Option<&V>
4. Visualização: Como o Vetor cresce 📈
graph TD
subgraph "Capacidade = 2"
V1["Vetor [10, 20]"]
end
V1 -- push(30) --> V2["Nova Alocação (Cap=4)"]
subgraph "Capacidade = 4"
V2["Vetor [10, 20, 30, _ ]"]
end
style V2 fill:#dfd,stroke:#333
5. Mini-Projeto: Sistema de Inventário 🎒
Crie um programa que:
1. Use um HashMap para armazenar o nome de itens e suas quantidades.
2. Use um Vec para armazenar uma lista de logs de atividades (ex: "Adicionado 5 maçãs").
3. Permita ao usuário:
- Adicionar um item.
- Remover um item.
- Ver o inventário total e o histórico de logs.
6. Exercício de Fixação 🧠
Coleções
Lembre-se: Vetores e Mapas armazenam seus dados na Heap, o que permite que cresçam dinamicamente.
- Por que não podemos usar um literal de string (
"texto") quando precisamos mudar o conteúdo? - Qual a vantagem de usar
v.get(index)em vez dev[index]? - O que acontece se inserirmos uma chave que já existe em um
HashMap?
Próxima Aula: Vamos criar nossos próprios tipos complexos com Structs e Enums! 🏗️