`yield from $ generator`和`return $ generator`之间的区别?

flo*_*ori 12 php return generator yield-from

我有一个功能,返回一个发电机.目前它使用yield from:

function foo()
{
    $generator = getGenerator();
    // some other stuff (no yields!)
    yield from $generator;
}
Run Code Online (Sandbox Code Playgroud)

如果我yield from用一个简单的替换它,return在这种情况下,这会改变什么吗?也许在执行中?还是表现?会yield from产生一个新的"外部"迭代器吗?

我知道,在其他情况下yield from可以更灵活,因为我可以使用它几次甚至将它与简单的yields 混合,但这对我的情况无关紧要.

小智 5

在您的情况下,更改yield fromreturn会产生相同的结果。但是,如果您yield之前有语句return,它不会合并 中的值getGenerator()

function gen_1()
{
    yield 1;
}

function gen_2()
{
    return gen_1();
}

function gen_3()
{
    yield 2;
    return gen_1();
}

function gen_4()
{
    yield 2;
    yield from gen_1();
}

echo "testing gen_2\n";
foreach (gen_2() as $v) {
    echo $v  . "\n";
}

echo "testing gen_3\n";
foreach (gen_3() as $v) {
    echo $v  . "\n";
}

echo "testing gen_4\n";
foreach (gen_4() as $v) {
    echo $v  . "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

testing gen_2
1
testing gen_3
2
testing gen_4
2
1
Run Code Online (Sandbox Code Playgroud)


Chr*_*oet 4

yield from当您像上面那样在方法末尾使用一次时,这不会改变方法返回的内容。但方法内部的代码还是有区别的:在yield from迭代开始时回滚迭代器时会调用 the 之前的任何代码,而在return调用函数时会执行 the 之前的代码,因为该函数只是一个普通函数现在(实际上,这并不特定于yield from。这是 的行为。有关证明yield,请参阅https://3v4l.org/jnPvC )。

最大的优点yield from是您可以在函数中多次使用它,它将所有迭代器的值组合到一个迭代器中。