Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Зачем нужны итераторы

Если вы хотите перебрать содержимое массива, вам понадобится определить:

  • Некоторое состояние, отслеживающее текущую позицию в процессе итерации, например индекс.
  • Условие, определяющее, когда итерация завершена.
  • Логику обновления состояния итерации на каждом шаге цикла.
  • Логику получения каждого элемента с использованием этого состояния итерации.

В цикле for в стиле C вы объявляете эти вещи напрямую:

for (int i = 0; i < array_len; i += 1) {
    int elem = array[i];
}

В Rust мы объединяем это состояние и логику в объект, известный как «итератор».

This slide should take about 3 minutes.
  • Этот слайд даёт контекст того, что итераторы Rust делают под капотом. Мы используем знакомую конструкцию цикла for в стиле C, чтобы показать, что итерация требует некоторого состояния и некоторой логики; на следующем слайде мы покажем, как итератор объединяет их.

  • В Rust нет цикла for в стиле C, но то же самое можно выразить через while:

    // Copyright 2024 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    let array = [2, 4, 6, 8];
    let mut i = 0;
    while i < array.len() {
        let elem = array[i];
        i += 1;
    }

Для дальнейшего изучения

Есть и другой способ выразить перебор массива с помощью for в C и C++: можно использовать указатель на начало и указатель на конец массива и сравнивать эти указатели, чтобы определить, когда цикл должен завершиться.

for (int *ptr = array; ptr < array + len; ptr += 1) {
    int elem = *ptr;
}

Если студенты спросят, можно указать, что именно так под капотом работают итераторы срезов и массивов в Rust (хотя реализованы они как итераторы Rust).