Зачем нужны итераторы
Если вы хотите перебрать содержимое массива, вам понадобится определить:
- Некоторое состояние, отслеживающее текущую позицию в процессе итерации, например индекс.
- Условие, определяющее, когда итерация завершена.
- Логику обновления состояния итерации на каждом шаге цикла.
- Логику получения каждого элемента с использованием этого состояния итерации.
В цикле for в стиле C вы объявляете эти вещи напрямую:
for (int i = 0; i < array_len; i += 1) {
int elem = array[i];
}
В Rust мы объединяем это состояние и логику в объект, известный как «итератор».
-
Этот слайд даёт контекст того, что итераторы 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).