Генераторы, Итераторы, Итерируемые объекты
Итератор
Итератор - объекты имплементирующий определенный интерфейс(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 интерфейса(о которых поговорим чуть позже):
Iterator
Iterable
Для объявления генераторов используется специальный синтаксис:
Обратите внимание!
👆Звездочка говорит нам о том, что функция является генератором.
danger
TODO: Дописать