rust-iterator-emoji
rust-iterator-emoji copied to clipboard
Learn Rust iterator methods via emoji
trafficstars
Iterator Methods
Basic
[🐮, 🥔, 🐔, 🌽]
.iter()
.cloned()
.collect::<Vec<_>>() // [🐮, 🥔, 🐔, 🌽]
[🐮, 🥔, 🐔, 🌽]
.iter()
.collect::<Vec<_>>() // [&🐮, &🥔, &🐔, &🌽]
[🐱, 🐶, 🐦].iter().count() // 3 (usize)
[🐱, 🐶, 🐦].iter().last() // &🐦
[🐱, 🐶, 🐦].iter().nth(1) // &🐶
Behavior
list = [🐮, 🥔, 🐔, 🌽]
.iter()
.cycle()
.take(6)
.collect::<Vec<_>>() // [&🐮, &🥔, &🐔, &🌽, &🐮, &🥔]
[🐮, 🥔, 🐔, 🌽]
.iter()
.rev()
.collect::<Vec<_>>() // [&🌽, &🐔, &🥔, &🐮]
[🐮, 🥔, 🐔, 🌽]
.iter()
.skip(2)
.collect::<Vec<_>>() // [&🐔, &🌽]
[🐮, 🥔, 🐔, 🌽]
.iter()
.step_by(2)
.collect::<Vec<_>>() // [&🐮, &🐔]
list = [🐮, 🥔, 🐔, 🌽]
.iter()
.take(3)
.collect::<Vec<_>>() // [&🐮, &🥔, &🐔]
Combine
let animals = [🐱, 🐶, 🐦];
let food = [🍰, 🍔, 🍬];
animals.iter()
.chain(food.iter())
.collect::<Vec<_>>() // [&🐱, &🐶, &🐦, &🍰, &🍔, &🍬]
vec![vec![🐱, 🐶, 🐦], vec![🍰, 🍔, 🍬]]
.iter()
.flatten()
.collect::<Vec<_>>() // [&🐱, &🐶, &🐦, &🍰, &🍔, &🍬]
let (animals, foods): (Vec<Animal>, Vec<Food>) =
[(🐱, 🍰), (🐶, 🍔), (🐦, 🍬)]
.iter()
.unzip(food.iter());
println!("{:?}", left); // [🐱, 🐶, 🐦]
println!("{:?}", right); // [🍰, 🍔, 🍬]
let animals = [🐱, 🐶, 🐦];
let food = [🍰, 🍔, 🍬];
animals.iter()
.zip(food.iter())
.collect::<Vec<_>>() // [(&🐱, &🍰), (&🐶, &🍔), (&🐦, &🍬)]
Recursive
[🐱, 🐶, 🐦]
.iter()
.enumerate()
.collect::<Vec<_>>() // [(0, &🐱), (1, &🐶), (2, &🐦)]
for (index, animal) in [🐱, 🐶, 🐦].iter().enumerate()
{
println!("{}, {}", index, animal) // "0, 🐱 ", "1, 🐶 ", "2, 🐦 "
}
let salad = vec![🥗]
let entree = vec![🍔, 🍟];
let dessert = vec![🍨, 🍰];
let dinner = vec![salad, entree, dessert];
let vegetarian_choices: Vec<Food> = dinner
.iter()
.flat_map(|course| {
course.iter().filter(|&food| is_vegetarian(food))
})
.collect(); // [🥗, 🍟, 🍰, 🍨] \TODO aren't these references?
[🍔, 🍟, 🍨] // calories: 500, 200, 600
.iter()
.fold(0, |total_calories, &food| {
total_calories + food
}) // 1300
[🐱, 🐶, 🐦]
.iter()
.for_each(|&animal| {
speak(animal) // "meow", "bark", "chirp"
});
[🐮, 🥔, 🐔, 🌽]
.iter()
.map(|&ingredient| cook(ingredient))
.collect::<Vec<_>>() // [🍔, 🍟, 🍗, 🍿]
[🍔, 🍟, 🍨] // calories: 500, 200, 600
.iter()
.scan(0, |total_calories, &food| {
*total_calories = *total_calories + food;
Some(total_calories)
})
.collect::<Vec<_>>() // [500, 700, 1300]
Search & Filter
[🍔, 🍟, 🍗, 🍿]
.iter()
.filter(|&food| is_vegetarian(food))
.collect::<Vec<_>>() // [&🍟, &🍿]
[🐮, 🥔, 🐔, 🌽]
.iter()
.filter_map(|&ingredient| {
if is_vegetable(ingredient) {
Some(cook(ingredient))
} else {
None
}
})
.collect::<Vec<_>>() // [🍟, 🍿]
[🐱, 🐶, 🐦, 🍰, 🍔, 🍬, 🐔]
.iter()
.skip_while(|&x| is_animal(x))
.collect::<Vec<_>>() // [&🍰, &🍔, &🍬, &🐔]
[🐱, 🐶, 🐦, 🍰, 🍔, 🍬, 🐔]
.iter()
.take_while(|&x| is_animal(x))
.collect::<Vec<_>>() // [&🐱, &🐶, &🐦]
let (vegetarian, omnivore): <(Vec<Food>, Vec<Food>)> = [🍔, 🍟, 🍗, 🍿]
.iter()
.partition(|food| is_vegetarian(food));
println!("{:?}", vegetarian); // [&🍟, &🍿]
println!("{:?}", omnivore); // [&🍔, &🍗]
[🍔, 🍟, 🍗, 🍿]
.iter()
.all(|&food| is_vegetarian(food)) // false
[🥗, 🍇, 🍅, 🍎]
.iter()
.all(|&food| is_vegetarian(food)) // true
[🍔, 🍟, 🍗, 🍿]
.iter()
.any(|&food| is_vegetarian(food)) // true
[🍔, 🍗, 🍣, 🥓]
.iter()
.any(|&food| is_vegetarian(food)) // false
[🍔, 🍟, 🍗, 🍿]
.iter()
.find(|&food| is_vegetarian(food)) // Some(&🍟)
[🍔, 🍗, 🍣, 🥓]
.iter()
.find(|&food| is_vegetarian(food)) // None
[🐮, 🥔, 🐔, 🌽]
.iter()
.find_map(|ingredient| {
if is_vegetable(ingredient) {
Some(ingredient)
} else {
None
}
}) // &🥔
[🍔, 🍟, 🍗, 🍿]
.iter()
.position(|&food| is_vegetarian(food)) // Some(1)
[🍔, 🍗, 🍣, 🥓]
.iter()
.position(|&food| is_vegetarian(food)) // None