13

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

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

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

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

4

2 回答 2

4

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

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

于 2017-05-23T14:36:21.543 回答
3

在您的情况下,更改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";
}

输出:

testing gen_2
1
testing gen_3
2
testing gen_4
2
1
于 2018-04-16T23:43:05.287 回答