Есть ли способ создать Python-подобные генераторы в JavaScript? - PullRequest
0 голосов
/ 11 июня 2018

В python, если вы перебираете (или используете)

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

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

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

Есть ли в javascript абстракция, чтобы скрыть эти различия, чтобы получить то же самоехорошая абстракция у какого питона?

1 Ответ

0 голосов
/ 11 июня 2018

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

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

  1. Итерация позначения:

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

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

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

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

    Или также:

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

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

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

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

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

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

Подробнее об итераторах и итерируемых элементах в MDN

...