Pular para conteúdo

Aula 11 - Programação Funcional em Rust 🚀

Objetivo

Objetivo: Explorar os recursos de programação funcional do Rust que permitem escrever código mais limpo, expressivo e eficiente, focando em Closures e Iterators.


1. Closures: Funções Anônimas 🔒

Closures são funções anônimas que você pode armazenar em variáveis ou passar como argumentos para outras funções. Ao contrário das funções normais, elas podem capturar valores do escopo onde foram definidas.

fn main() {
    let x = 4;

    // Uma closure simples
    let somar_x = |y| y + x;

    println!("Resultado: {}", somar_x(2)); // 6
}

2. Iterators: Processando Sequências 🔄

O padrão Iterator permite realizar algumas tarefas em uma sequência de itens. Em Rust, iteradores são "preguiçosos" (lazy), o que significa que eles não fazem nada até que você chame métodos que os consumam.

let v1 = vec![1, 2, 3];
let v1_iter = v1.iter(); // Apenas cria o iterador

for val in v1_iter {
    println!("Valor: {}", val);
}

3. Métodos Adaptadores: map, filter e collect 🧪

Estes métodos transformam um iterador em outro tipo de iterador ou em uma coleção.

  • map: Transforma cada item.
  • filter: Mantém apenas itens que satisfazem uma condição.
  • collect: Transforma o iterador de volta em uma coleção (ex: Vec).
let v1: Vec<i32> = vec![1, 2, 3];

let v2: Vec<_> = v1.iter()
    .map(|x| x + 1)
    .filter(|x| x % 2 == 0)
    .collect();

println!("{:?}", v2); // [2, 4]

4. Abstrações de Custo Zero (Zero-Cost Abstractions) ⚡

Bjarne Stroustrup (criador do C++) definiu o termo que o Rust segue à risca: "O que você não usa, você não paga. E o que você usa, você não poderia escrever melhor à mão".

Isso significa que usar map e filter é tão rápido quanto escrever um loop for manual, pois o compilador otimiza tudo de forma agressiva.


5. Visualização: Pipeline de Dados ⛓️

graph LR
    A["[1, 2, 3, 4]"] --> B["iter()"]
    B --> C["filter(x > 2)"]
    C --> D["map(x * 10)"]
    D --> E["collect()"]
    E --> F["[30, 40]"]
    style B fill:#f96
    style E fill:#f96

6. Mini-Projeto: Analisador de Logs 📊

Crie um sistema que: 1. Receba um Vec de Strings representando logs de um sistema (ex: "INFO: Login", "ERROR: Falha de Disco", "INFO: Logout"). 2. Use iteradores para filtrar apenas os logs que contêm "ERROR". 3. Use map para extrair apenas a mensagem após o prefixo "ERROR: ". 4. Use collect para armazenar os resultados em um novo Vec. 5. Exiba a contagem total de erros encontrados.


7. Exercício de Fixação 🧠

  1. O que significa dizer que um iterador é "preguiçoso"?
  2. Qual a principal vantagem das Closures sobre funções comuns?
  3. Explique com suas palavras o conceito de "Abstração de Custo Zero".

Próxima Aula: Vamos profissionalizar nosso código com Testes e Documentação! 🧪