Определить, принимает ли генератор PHP send ()? - PullRequest
1 голос
/ 02 августа 2020

Можно ли каким-то образом определить, может ли генератор принимать любую команду send ()? То есть, если у него есть такая строка:

$gen = yield;

Вариант использования - это когда генераторы используются для исключения побочных эффектов (как в redux-saga). Если ни одно выражение не зависит от результата какого-либо побочного эффекта, все побочные эффекты могут выполняться одновременно (неблокирующий ввод-вывод).

Не удалось найти полезной информации в API отражения: https://www.php.net/manual/en/class.reflectiongenerator.php

Редактировать : Короче говоря, должно быть возможно различать guish между

function gen1() {
  yield $something;
}

и

function gen2() {
  $result = yield $something;  // Accepting send()
}

1 Ответ

1 голос
/ 03 августа 2020

Как упоминалось в комментариях, и после небольшого дополнительного исследования, я вполне уверен, что то, о чем вы спрашиваете, невозможно:

Давайте сначала попробуем резюмировать, как работают генераторы:

  • Когда функция содержит хотя бы одно выражение yield, она становится функцией генератора, которая возвращает экземпляр Generator.
  • Выражение yield в основном выполняет следующие функции:
    1. сначала он обновляет текущее значение генератора своим значением (значение сразу после yield или null, если его нет),
    2. затем он ждет, пока не будет вызван Generator::send на генераторе (Generator::next(), который вызывается при итерации по генератору, в точности совпадает с Generator::send(null)),
    3. когда он получает значение через Generator::send, он делает выражение yield оценить все, что было передано в качестве параметра,
    4. , только тогда функция может возобновить свое выполнение (возможно, до следующего выражения yield).

Итак, пишете ли вы:

yield;  // same as `yield null;`

или

yield 'some value';

или

$result = yield;

или

$result = yield 'some value';

Конечный результат тот же, значение yield просто оценивает к параметру Generator::send. Независимо от того, используете ли вы результат выражения, это ничего не меняет с точки зрения генератора.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...