Rust
Iterator
Iterator adapters and consumers.
By EZ4Code Team
iteratoriterator
Code
fn main() {
let nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// map
let squares: Vec<i32> = nums.iter().map(|x| x * x).collect();
// filter
let evens: Vec<&i32> = nums.iter().filter(|x| *x % 2 == 0).collect();
// fold (reduce)
let sum: i32 = nums.iter().fold(0, |acc, x| acc + x);
// Chained calls
let result: i32 = nums.iter()
.filter(|x| *x % 2 == 0)
.map(|x| x * x)
.sum();
// enumerate
for (i, val) in nums.iter().enumerate() {
println!("{}: {}", i, val);
}
// zip
let names = vec!["Alice", "Bob"];
let ages = vec![30, 25];
let pairs: Vec<_> = names.iter().zip(ages.iter()).collect();
// Custom iterator
let mut counter = Counter::new();
for c in counter.by_ref().take(3) {
println!("count: {}", c);
}
}
struct Counter { count: u32 }
impl Counter {
fn new() -> Counter { Counter { count: 0 } }
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
self.count += 1;
if self.count <= 5 { Some(self.count) } else { None }
}
}Explanation
Iterators are lazy; adapter methods return new iterators; collect consumes the iterator to gather results.