【问题标题】:How to reset yield from within a generator in PHP如何在 PHP 的生成器中重置产量
【发布时间】: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-&gt;generatorB())更改为iterator_to_array($gen-&gt;generatorB(), false)

标签: php reset yield yield-from


【解决方案1】:

所有功劳归@Frankich! (第二条评论)

问题是,“iterator_to_array”评估了生成器的键。

所以生成器会默默地返回所用生成器的键(yield from):

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-&gt;generatorB())) 被覆盖的地方(就像@Frankich 指出的那样)!

而且只有: iterator_to_array($gen-&gt;generatorB()), false) 阻止了这种情况。

感谢输入!

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2017-05-17
    • 2016-07-26
    • 2021-06-11
    • 2014-03-20
    • 2020-05-25
    • 2017-05-10
    • 2017-03-06
    • 2014-05-30
    相关资源
    最近更新 更多