`yield from $generator` 和 `return $generator` 有什么区别?

13

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

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

如果我用简单的return替换yield from,在这种情况下会有什么变化吗?也许在执行方面?或性能?yield from是否会产生新的“外部”迭代器?

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


请务必阅读来自文档的警告,该警告涉及使用yield from后跟iterator_to_array()的情况。 - y2k-shubham
2个回答

4
当您像上面那样在方法末尾使用yield from一次时,这不会改变方法返回的内容。但是对于方法内部的代码仍然有所不同:当在迭代开始时倒回迭代器时,调用yield from之前的任何代码都会被执行,而在调用函数时执行return之前的代码则是普通函数的执行方式(实际上,这不仅适用于yield from,也适用于yield。请参见https://3v4l.org/jnPvC进行证明)。 yield from的一个巨大优势是您可以在函数中多次使用它,将所有迭代器的组合值合并为单个迭代器。

4
在您的情况下,将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接