Введение

Недавно у меня возникла потребность в получении потоковых данных в проекте, написанном на Flutter. Это был мой первый раз, когда я использовал ключевое слово «доходность», но мне было неудобно его использовать. Таким образом, я решил изучить и написать сообщение в блоге по теме.

В этой статье можно бесплатно добавлять комментарии и отзывы!

Итератор

Определение

Вот определение из MDN.

Итератор — это любой объект, который реализует протокол итератора с помощью метода next(), который возвращает объект с двумя свойствами:

Значение: следующее значение в последовательности итераций.

Готово. Это true, если последнее значение в последовательности уже использовано. Если value присутствует рядом с done, это возвращаемое значение итератора.

Проще говоря, итератор — это объект, удовлетворяющий интерфейсу, определенному протоколом итератора. Давайте посмотрим примеры.

Вот минимизированный пример итератора.

Когда следующий вызывается из объекта итератора, свойство done определяет, должен ли итератор продолжать или останавливаться, а значение предназначено для получения значения от итератора.

Давайте создадим более сложный пример итератора. В этом примере используется последовательность Фибоначчи.

Типографический текст

Я использовал typescript для создания объекта итератора, чтобы улучшить читаемость.

Я создаю класс для итератора, добавляя значение и делая его свойством, он одновременно становится итератором и итератором. Это связано с тем, что для вычисления значения последовательности Фибоначчи текущее и предыдущее значения должны где-то храниться.

Дротик

В дарте у него также есть класс итератора, похожий на js.

Итерируемый

Iterable — это класс-оболочка для Iterator.

Вот определение из MDN.

[Symbol.iterator]

Функция без аргументов, которая возвращает объект, соответствующий протоколу итератора.

Полезные советы по использованию Iterable

Iterable — это интерфейс. Это означает, что когда объект соответствует своему определению, он может использовать методы и операторы, предоставляемые языком. Например, в javascript, когда у вас есть итерируемый объект, вы можете использовать

  1. Для цикла
  2. Оператор спреда
  3. Присвоение деструктуризации
  4. API позволяет повторять

Почему Iterable (не итератор)

Обернув итератор другим объектом (или классом), можно повысить возможность повторного использования. Например,

Вторая функция цикла ничего не выведет на консоль, потому что итератор уже достигает значения done. Однако, обернув итератор, его можно использовать повторно.

Типографический текст

Дротик

Генератор

Наконец, давайте рассмотрим ключевое слово «доходность».

"Синтаксис"

[rv] = yield [expression]

expression Дополнительно

Определяет значение, которое будет возвращаться из функции-генератора через протокол итератора. Если он опущен, вместо него возвращается undefined.

rv Опционально

Извлекает необязательное значение, переданное методу next() генератора, чтобы возобновить его выполнение.

Короче говоря, функция-генератор может быть создана с помощью функции * и ключевого слова yield, поэтому приведенный выше код можно реорганизовать, как показано ниже, с помощью функции-генератора.

Типографический текст

Next() в интерфейсе итератора скрыт, когда вы используете функцию генератора. Это связано с тем, что функция генератора возвращает объект генератора, который соответствует как итерируемому протоколу, так и протоколу итератора. Таким образом, из ключевого слова yield он знает «значение» из next() (протокол итератора). Кроме того, если нет значения для возврата (например, нет больше полученного значения), он возвращает «готово» как истину.

Используя функцию генератора, можно уменьшить объем кода!

Дротик