What are Iterators?
An iterator in Rust is like an automatic conveyor belt that processes elements one at a time. It helps you traverse, filter, map, and consume data efficiently.
Creating an Iterator
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let mut iter = numbers.iter();
println!("First element: {:?}", iter.next()); // Some(1)
println!("Second element: {:?}", iter.next()); // Some(2)
}
.iter() returns an iterator reference. .next() moves to the next element (returns None when exhausted).
Transforming Data with Iterators
Iterators have cool methods like .map() and .filter() for functional programming magic! 🪄
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let doubled: Vec<i32> = numbers.iter().map(|x| x * 2).collect();
println!("Doubled: {:?}", doubled);
}
.map(|x| x * 2) transforms each element. .collect() turns an iterator into a Vec.
What are Closures?
A closure is like a mini-function that can capture variables from its environment.
Defining a Closure
fn main() {
let add = |a, b| a + b; // Closure
println!("Sum: {}", add(5, 3));
}
Closures use | instead of fn(). They capture variables from their surrounding scope!
Using Closures in Iterators
Closures and iterators go hand-in-hand like peanut butter and jelly!
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let even_numbers: Vec<i32> = numbers.into_iter().filter(|x| x % 2 == 0).collect();
println!("Even numbers: {:?}", even_numbers);
}
.filter(|x| x % 2 == 0) keeps even numbers only. .into_iter() moves ownership.
When to Use Iterators & Closures?
- Use iterators for cleaner loops and lazy evaluation.
- Use closures for short, flexible functions.
0 Comments:
Posting Komentar