Как ограничить результаты, возвращаемые генератором? - PullRequest
0 голосов
/ 23 апреля 2019
interface Yielder
{
   public function getData(): iterable;
}

class ClassicYielder implements Yielder
{
   public function getData(): iterable
   {
       yield 1;
       yield 2;
       yield 3;
       yield 4;
       yield 5;
   }
}

class LimitedYielder implements Yielder
{
   private $wrapped;

   private $total = 3;

   private $count = 0;

   public function __construct(Yielder $wrapped)
   {
       $this->wrapped = $wrapped;
   }

   public function getData(): iterable
   {
       if ($this->count < $this->total) {
          $this->count++;
          yield from $this->wrapped->getData();
       }

       // how to stop here?
   }
}

$x = new ClassicYielder();
$y = new LimitedYielder($x);

foreach ($y->getData() as $data) {
   echo $data;
}

===

Will print: 1 2 3 4 5

У меня есть интерфейс Yielder с одним методом, который возвращает итерацию через yield.Я хочу обернуть мой классический урожай в ограниченный, который дает значения только до тех пор, пока выполняется условие.Как видите, приведенный выше код выдаст все значения моего классического урожайника, не отслеживая мой счетчик.

Что я здесь не так делаю?Можно ли как-нибудь заставить это работать?

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