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

时间:2016-05-12 13:23:19

标签: php return generator yield-from

我有一个功能可以回馈发电机。目前它使用yield from

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

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

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

2 个答案:

答案 0 :(得分:4)

如上所述,当您在方法结束时使用yield from一次时,这不会改变方法返回的内容。但是方法中的代码仍然存在差异:在迭代开始时倒带迭代器时调用yield from之前的任何代码,而在调用时执行return之前的代码函数,因为此函数现在只是一个普通函数(实际上,这不是yield from特有的。它是yield的行为。请参阅https://3v4l.org/jnPvC以获取证明。

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

答案 1 :(得分:1)

在您的情况下,将yield from更改为return会得到相同的结果。但是,如果您在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";
}

输出:

testing gen_2
1
testing gen_3
2
testing gen_4
2
1