【发布时间】:2019-11-20 20:18:45
【问题描述】:
我正在尝试设置耦合屈服函数。但是当第二次调用该函数时,集成的 yield from 不会重置。
我认为最简单的方法是用一个例子来展示:
代码示例
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 所说:在第二个“for-each”中调用生成器非常有效。只有在调用“iterator_to_array”时才会出现问题!这是预期的行为吗?
我尝试在 generatorB 的末尾重置 generatorA,如下所示:
PHP
public function generatorB() {
yield from $this->generatorA();
for($i = 0; $i < 26; $i++) {
yield chr(65 + $i);
}
$this->generatorA()->reset();
}
但无济于事。
问题:这是预期的行为吗?我需要做什么才能重置“内部”生成器?
【问题讨论】:
-
这听起来与需要的重置无关,但从
iterator_to_array函数中,它从未以某种方式考虑第一个生成器,顺便说一下,我不知道为什么。 tehplayground.com/bQW1DS4sLsmMj51N 。编辑:如果你使用iterator_to_array和 false 作为第二个参数,它会按预期工作。 php.net/manual/en/function.iterator-to-array.php -
基本上,第二个生成器会擦除
iterator_to_array中的第一个,因为它们具有相同的键,所以只需将iterator_to_array($gen->generatorB())更改为iterator_to_array($gen->generatorB(), false)
标签: php reset yield yield-from