SerafimArts
@SerafimArts
Senior Notepad Reader

Будут ли отличия при экспорте корутины и возврате оной?

Подскажите пожалуйста новичку по основам php.

Какие могут быть отличия при экспорте и возврате корутины?
class Exported implements \IteratorAggregate
{
    public function test(): \Traversable
    {
        yield 'a' => 23;
        yield 'b' => 42;
    }

    public function getIterator(): \Traversable
    {
        yield from $this->test();
    }
}

class Returned implements \IteratorAggregate
{
    public function test(): \Traversable
    {
        yield 'a' => 23;
        yield 'b' => 42;
    }

    public function getIterator(): \Traversable
    {
        return $this->test();
    }
}


Вроде и там и там тот же самый объект, хотя казалось бы, что в случае ретурна должен быть выполнен rewind() генератора... Но кажется нет. Может есть какие-то отличия?
  • Вопрос задан
  • 314 просмотров
Решения вопроса 1
SerafimArts
@SerafimArts Автор вопроса
Senior Notepad Reader
Давным давно задавал этот вопрос. Отвечаю сам себе. В случае yield from он не захватывает return statment, объявленный в экспортируемом генераторе, в отличии от return.

В качестве аналогии
return $this->test();

Можно использовать такой вариант:
yield from $result = $this->test();
return $result->getReturn();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
egor_nullptr
@egor_nullptr
С точки зрения использования никаких отличий в поведении получаемого генератора нет. Фактически, они одно и то же:
$ge = (new Exported())->getIterator();
$gr = (new Returned())->getIterator();
assert($ge == $gr);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы