“来自$generator的收益”和“返回$generator”之间的差异


Difference between `yield from $generator` and `return $generator`?

我有一个函数可以返回生成器。目前它使用yield from:

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

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

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

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

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

在您的情况下,将yield from更改为return会得到相同的结果。但是,如果在return之前有yield语句,则它不会组合来自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";
}

输出:

testing gen_2
1
testing gen_3
2
testing gen_4
2
1