Iterators aur Closures
map aur filter jaise iterator methods ek collection ko lazily transform karte hain, kuch bhi allocate kiye baghair jab tak collect results ko Vec jaise ek concrete type mein na khinche. map mein pass kiya gaya closure har element ke liye ek martaba chalta 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);
}[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 istemal 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));
}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 istemal kar ke har number ko square karein, ek Vec<i32> mein collect karein, aur use {:?} se print karein.