rust-iterator-emoji icon indicating copy to clipboard operation
rust-iterator-emoji copied to clipboard

Learn Rust iterator methods via emoji

trafficstars

Iterator Methods

Basic

cloned

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .cloned()
    .collect::<Vec<_>>() // [🐮, 🥔, 🐔, 🌽]

collect

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .collect::<Vec<_>>() // [&🐮, &🥔, &🐔, &🌽]

count

[🐱, 🐶, 🐦].iter().count() // 3 (usize)

last

[🐱, 🐶, 🐦].iter().last() // &🐦 

nth

[🐱, 🐶, 🐦].iter().nth(1) // &🐶

Behavior

cycle

list = [🐮, 🥔, 🐔, 🌽]
    .iter()
    .cycle()
    .take(6)
    .collect::<Vec<_>>() // [&🐮, &🥔, &🐔, &🌽, &🐮, &🥔]

rev

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .rev()
    .collect::<Vec<_>>() // [&🌽, &🐔, &🥔, &🐮]

skip

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .skip(2)
    .collect::<Vec<_>>() // [&🐔, &🌽]

step_by

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .step_by(2)
    .collect::<Vec<_>>() // [&🐮, &🐔]

take

list = [🐮, 🥔, 🐔, 🌽]
    .iter()
    .take(3)
    .collect::<Vec<_>>() // [&🐮, &🥔, &🐔]

Combine

chain

let animals = [🐱, 🐶, 🐦];
let food = [🍰, 🍔, 🍬];
animals.iter()
    .chain(food.iter())
    .collect::<Vec<_>>() // [&🐱, &🐶, &🐦, &🍰, &🍔, &🍬]

flatten

vec![vec![🐱, 🐶, 🐦], vec![🍰, 🍔, 🍬]]
    .iter()
    .flatten()
    .collect::<Vec<_>>() // [&🐱, &🐶, &🐦, &🍰, &🍔, &🍬]

unzip

let (animals, foods): (Vec<Animal>, Vec<Food>) = 
[(🐱, 🍰), (🐶, 🍔), (🐦, 🍬)]
    .iter()
    .unzip(food.iter());

println!("{:?}", left); // [🐱, 🐶, 🐦]
println!("{:?}", right); // [🍰, 🍔, 🍬]

zip

let animals = [🐱, 🐶, 🐦];
let food = [🍰, 🍔, 🍬];
animals.iter()
    .zip(food.iter())
    .collect::<Vec<_>>() // [(&🐱, &🍰), (&🐶, &🍔), (&🐦, &🍬)]

Recursive

emumerate

[🐱, 🐶, 🐦]
    .iter()
    .enumerate()
    .collect::<Vec<_>>() // [(0, &🐱), (1, &🐶), (2, &🐦)]
for (index, animal) in [🐱, 🐶, 🐦].iter().enumerate() 
{
    println!("{}, {}", index, animal) // "0, 🐱 ", "1, 🐶 ", "2, 🐦 "
}

flat_map

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?

fold

[🍔, 🍟, 🍨] // calories: 500, 200, 600
    .iter()
    .fold(0, |total_calories, &food| {
        total_calories + food
    }) // 1300

for_each

[🐱, 🐶, 🐦]
    .iter()
    .for_each(|&animal| {
        speak(animal) // "meow", "bark", "chirp"
    });

map

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .map(|&ingredient| cook(ingredient))
    .collect::<Vec<_>>() // [🍔, 🍟, 🍗, 🍿]

scan

[🍔, 🍟, 🍨] // 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

filter

[🍔, 🍟, 🍗, 🍿]
    .iter()
    .filter(|&food| is_vegetarian(food))
    .collect::<Vec<_>>() // [&🍟, &🍿]

filter_map

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .filter_map(|&ingredient| {
        if is_vegetable(ingredient) {
            Some(cook(ingredient))
        } else {
            None
        }
    })
    .collect::<Vec<_>>() // [🍟, 🍿]

skip_while

[🐱, 🐶, 🐦, 🍰, 🍔, 🍬, 🐔]
    .iter()
    .skip_while(|&x| is_animal(x))
    .collect::<Vec<_>>() // [&🍰, &🍔, &🍬, &🐔]

take_while

[🐱, 🐶, 🐦, 🍰, 🍔, 🍬, 🐔]
    .iter()
    .take_while(|&x| is_animal(x))
    .collect::<Vec<_>>() // [&🐱, &🐶, &🐦]

partition

let (vegetarian, omnivore): <(Vec<Food>, Vec<Food>)> = [🍔, 🍟, 🍗, 🍿]
    .iter()
    .partition(|food| is_vegetarian(food));
    
println!("{:?}", vegetarian); // [&🍟, &🍿]
println!("{:?}", omnivore); // [&🍔, &🍗]

all

[🍔, 🍟, 🍗, 🍿]
    .iter()
    .all(|&food| is_vegetarian(food)) // false
[🥗, 🍇, 🍅, 🍎]
    .iter()
    .all(|&food| is_vegetarian(food)) // true

any

[🍔, 🍟, 🍗, 🍿]
    .iter()
    .any(|&food| is_vegetarian(food)) // true
[🍔, 🍗, 🍣, 🥓]
    .iter()
    .any(|&food| is_vegetarian(food)) // false

find

[🍔, 🍟, 🍗, 🍿]
    .iter()
    .find(|&food| is_vegetarian(food)) // Some(&🍟)
[🍔, 🍗, 🍣, 🥓]
    .iter()
    .find(|&food| is_vegetarian(food)) // None

find_map

[🐮, 🥔, 🐔, 🌽]
    .iter()
    .find_map(|ingredient| {
        if is_vegetable(ingredient) {
            Some(ingredient)
        } else {
            None
        }
    }) // &🥔 

position

[🍔, 🍟, 🍗, 🍿]
    .iter()
    .position(|&food| is_vegetarian(food)) // Some(1)
[🍔, 🍗, 🍣, 🥓]
    .iter()
    .position(|&food| is_vegetarian(food)) // None