我有一个函数可以返回生成器。目前它使用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