AnyCompiler

Iterators y Closures

Métodos de iterador como map y filter transforman una colección de forma perezosa (lazy), sin asignar nada hasta que collect reúne los resultados en un tipo concreto como un Vec. El closure que se pasa a map se ejecuta una vez por cada 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]

Los closures capturan su entorno

Un closure, escrito como |params| expresión, puede usar variables del ámbito en el que fue definido — multiply abajo captura factor de main, algo que un fn normal no puede hacer.

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

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

Siguiente: traits — definir comportamiento compartido que distintos tipos pueden implementar.

Practice Exercise

Dado numbers: Vec<i32> = vec![1, 2, 3, 4], usa .iter().map() con un closure para elevar al cuadrado cada número, recoge el resultado en un Vec<i32> con collect, e imprímelo con {:?}.