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.
main.rs
Pruébalo tú mismo →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.
main.rs
Pruébalo tú mismo →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 {:?}.