Генераторы, Итераторы, Итерируемые объекты
Итератор
Итератор - объекты имплементирующий определенный интерфейс(Iterator). Сам же интерфейс достаточно простой, давайте попробуем его описать через Typescript:
Как прочитать написанное выше?
IteratorЭто какой-либо объект с методомnext, при вызове этого метода он возвращает другой объект реализующий интерфейсIteratorValue.IteratorValueЭто объект с 2 свойствами:
value- произвольное значение из итератораdone- булевое поле говорящее нам о статусе итератора, у последнего вернувшегося из итератора значения должно быть значениеtrue, что говорит о том, что итерирование закончено.
Сами по себе итераторы не используются, но с этим интерфейсом вы будете сталкиваться при работе с Iterable или Generator.
Простой пример итератора
Как видите это обычный объект с методом next. Давайте теперь вызовем этот метод несколько раз:
note
Этот пример есть в репозитории с ноутбуками
Из кода выше мы получим примерно такое:
Итерируемый объект
Итерируемый объект - Это объект имплементирующий интерфейс Iterable. Такой объект вы можете использовать вместе с spread-оператором, передавать в метод Array.from(), оператор for...of тоже работает именно с итерируемыми объектами.
caution
Должен предупредить, что объекты не являются итерируемыми объектами, хотя их можно использовать с spread-оператором.
Более детально читайте как всегда на MDN:
info
Думаю, что вы уже поняли, что Array реализовывает интерфейс Iterable.
Iterable - это интерфейс(как и Iterator), давайте опишем его с помощью Typescript:
Ну что? Надо объяснять? Давайте кратко... Объект реализующий этот интерфейс должен иметь метод по ключу Symbol.iterator(Symbol), метод должен возвращать объект реализующий интерфейс Iterator.
Вопрос
У вас есть идея как сделать так чтобы объект реализовывал одновременно интерфейс Iterator и Iterable? Что бы следующий код сработал:
Простой пример итерируемого объекта
Генераторы
Генератор - функция которая вернет объекты генератора, который в свою очередь реализовывает 2 интерфейса(о которых поговорим чуть позже):
IteratorIterable
Для объявления генераторов используется специальный синтаксис:
Обратите внимание!
👆Звездочка говорит нам о том, что функция является генератором.
danger
TODO: Дописать