AnyCompiler

Iterators e Closures

Métodos de iterador como map e filter transformam uma coleção de forma preguiçosa (lazy), sem alocar nada até que collect reúna os resultados em um tipo concreto como um Vec. O closure passado para map roda uma vez por elemento.

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];

    let doubled: Vec<i32> = numbers.iter().map(|x| x * 2).collect();
    println!("{:?}", doubled);

    let evens: Vec<&i32> = numbers.iter().filter(|&&x| x % 2 == 0).collect();
    println!("{:?}", evens);
}
Output
[2, 4, 6, 8, 10]
[2, 4]

Closures capturam seu ambiente

Um closure, escrito como |params| expressão, pode usar variáveis do escopo em que foi definido — multiply abaixo captura factor de main, algo que uma fn comum não consegue fazer.

fn main() {
    let factor = 3;
    let multiply = |x: i32| x * factor;

    println!("{}", multiply(5));
    println!("{}", multiply(10));
}
Output
15
30

Próximo: traits — definir comportamento compartilhado que diferentes tipos podem implementar.

Practice Exercise

Dado numbers: Vec<i32> = vec![1, 2, 3, 4], use .iter().map() com um closure para elevar ao quadrado cada número, colete em um Vec<i32> com collect, e imprima com {:?}.