Я собираюсь опубликовать два решения (пожалуйста, подумайте о замене следующих кодов частью: // Return $generator?
в коде в вопросе), но я не могу ответить на свой первый вопрос.
Сдача и возврат
Одно из возможных решений - получить все значения из sampleGenerator()
и затем вернуть его возвращаемое значение:
// Please notice the &
foreach ($generator as $key => &$value) {
yield $key => $value;
}
return $generator->getReturn();
Работает отлично и предотвращаетошибки, даже если используются вложенные генераторы или если генератор не выдает или не возвращает никаких значений.Однако в некоторых случаях, как по мне, код станет труднее читать из-за его частого использования.
Возврат самого генератора
Проще говоря, вы можете вернуть возвращенный генератор:
return $generator;
На первый взгляд, это выглядит проще, но если вы работаете над некоторыми сложными частями кода, то это становится немного сложнее.Просто имейте в виду, что если вы не используете оператор yield
где-то в функции, он возвращает экземпляр Generator
и не является функцией-генератором.Несмотря на это, как и в случае со мной, ваша проблема может быть решена добавлением пустого дохода (обратите внимание, это будет генератор):
return $generator;
yield;
Примечание : Возможно,очевидно, но это не всегда рабочие решения.Вы должны рассмотреть свою собственную проблему и затем попытаться решить ее;поэтому вам могут понадобиться оба способа, чтобы выполнить работу!
Надеюсь, это поможет!