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.
main.rs
Teste você mesmo →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.
main.rs
Teste você mesmo →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 {:?}.