Есть ли способ создать Python-подобные генераторы в JavaScript?

1

В python, если вы зацикливаете (или потребляете)

  1. итератор
  2. возвращаемое значение функции

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

Однако, насколько я знаю в javascript, если вы хотите использовать выход, вы должны явно отметить функцию * звездочкой и не можете обрабатывать вычисленное значение так же, как "возвращаемое значение регулярной функции" на стороне вызывающего абонента.

Есть ли абстракция в javascript, чтобы скрыть эти различия, чтобы получить ту же красивую абстракцию, что и у python?

  • 0
    @ Jony-Y: Ваша ссылка сломалась; парсер не считает * часть ссылки. Этот должен идти туда, куда ты хотел.
  • 0
    Не уверен, почему синтаксис генератора JS беспокоит вас ... У вас есть решение, как это сделать. Вы просто не хотите использовать синтаксис генератора?
Показать ещё 6 комментариев
Теги:
iterator
generator

1 ответ

0

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

Вот два примера того, как вы можете обработать возвращаемое значение такой функции:

  1. Итерируйте через значения:

    for (let x of f()) {
        // ...
    }
    

    В зависимости от того, что возвращает f(), x будет следующим:

    • Итерировать строку: получить каждый символ
    • Итерировать массив: получить каждый его элемент
    • Итерация карты: получите каждую пару ключ/значение
    • Итерация итератора (возможно, возвращается генератором): получить каждое полученное значение от него
    • ...
  2. Создайте массив из значений:

    const copy = Array.from(f());
    

    Или также:

    const copy = [...f()];
    

    NB: хорошая вещь из Array.from заключается в том, что она принимает функцию обратного вызова в качестве второго аргумента: для каждого значения используется mapper.

  3. Распространение значений в качестве аргументов другой функции

    Если значения являются численными:

    Math.min(...f());
    

    Поскольку Math.min может принимать несколько аргументов (не только два), это дает минимальное значение целой серии (как min в Python).

Подробнее об итераторах и итерациях на MDN

Ещё вопросы

Сообщество Overcoder
Наверх
Меню