AnyCompiler

Iterators aur Closures

map aur filter jaise iterator methods ek collection ko lazily transform karte hain, kuch bhi allocate kiye bina jab tak collect results ko Vec jaise ek concrete type mein na khinche. map mein pass kiya gaya closure har element ke liye ek baar run hota hai.

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 apna environment capture karte hain

Ek closure, jo |params| expression se likha jaata hai, us scope se variables use kar sakta hai jisme woh define hua tha — neeche multiply, main se factor capture karta hai, kuch aisa jo ek plain fn nahi kar sakta.

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

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

Aage: traits — shared behavior define karna jo alag alag types implement kar sakte hain.

Practice Exercise

numbers: Vec<i32> = vec![1, 2, 3, 4] diya gaya hai, .iter().map() ko ek closure ke sath use karke har number ko square karo, ek Vec<i32> mein collect karo, aur use {:?} se print karo.