Как сбросить доходность из генератора в PHP - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь настроить функцию связанной доходности .Но когда функция вызывается во второй раз, интегрированный доход из не сбрасывается .

Я думаю, что самый простой способ - показать на примере:

Пример кода

PHP

class GeneratorTest
{

    public function generatorA() {
        for ($i = 0; $i < 10; $i++) {
            yield $i;
        }
    }


    // Generators can yield from other generators
    public function generatorB() {
        yield from $this->generatorA();  // << why is this not reset?

        for($i = 0; $i < 26; $i++) {
            yield chr(65 + $i);
        }
    }

}


$gen = new GeneratorTest();

echo "Test 1 from Generator B<br>";
foreach ($gen->generatorB() as $item) {
    echo $item . "<br>";
}

echo "Test 2 from Generator B<br>";
print_r(iterator_to_array($gen->generatorB()));

Ожидается?

Я ожидал, что выходные данные «Test 2» будут идентичны «Test 1».Но на самом деле кажется, что доход от генератора не сбрасывается при использовании.

Редактировать / Важно:

Как отмечено @Ganesh Wagh: вызов генератора за секунду "для каждого" работаетв совершенстве.Проблема действительно возникает только при вызове "iterator_to_array"!Это ожидаемое поведение.

Я попытался сбросить генератор A в конце генератора B следующим образом:

PHP

public function generatorB() {
    yield from $this->generatorA();

    for($i = 0; $i < 26; $i++) {
        yield chr(65 + $i);
    }
    $this->generatorA()->reset();
}

Но безрезультатно.

Вопрос: Это ожидаемое поведение?Что мне нужно сделать, чтобы сбросить «внутренний» генератор?

1 Ответ

0 голосов
/ 11 июля 2019

Вся заслуга принадлежит @Frankich! (Второй комментарий)

Проблема заключалась в том, что "iterator_to_array" оценивал ключи генератора.

Таким образом, генератор молча возвращает ключи использованного генератора (выход из):

echo "Test 1 from Generator B\n";
foreach ($gen->generatorB() as $key => $item) {
    echo $key . '=>' .  $item . "\n";
}

Результат:

1=>1
2=>2
...
0=>A
1=>B
2=>C
...

Итак, ключи в: iterator_to_array($gen->generatorB())) где перезаписано (как указано @Frankich)!

и только: iterator_to_array($gen->generatorB()), false) предотвратил это.

Спасибо за ввод!

...