Iterators

Links:

Итераторы

Итераторы позволяют выполнять действия по очереди над цепочкой данных. Итератор берёт каждый объект цепочки и проверяет, не последний или он. Итераторы в Rust - ленивые, т.е не отрабатывают, пока не будет вызван метод, который их поглощает.

let v1 = vec![1, 2, 3]; 
let v1_iter = v1.iter();

for val in v1_iter {  // iterator consume by for cycle
  println!("Got: {val}");
}

Отличие .map() и .flat_map()

Обе функции раскрывают итератор вектора, однако, с разным результатом:

fn main() {
    let numbers = vec![1, 2, 3];

    // Using `map()`
    let mapped: Vec<Vec<i32>> = numbers.iter().map(|&n| vec![n, n * 10]).collect();
    println!("{:?}", mapped); // [[1, 10], [2, 20], [3, 30]]

    // Using `flat_map()`
    let flat_mapped: Vec<i32> = numbers.iter().flat_map(|&n| vec![n, n * 10]).collect();
    println!("{:?}", flat_mapped); // [1, 10, 2, 20, 3, 30]
}

.map() - сохраняет структуру в итоговом результате .flat_map() - убирает лишние структуры