我有一个功能可以回馈发电机。目前它使用yield from
:
function foo()
{
$generator = getGenerator();
// some other stuff (no yields!)
yield from $generator;
}
如果我用简单的yield from
替换return
,那么这种情况会改变吗?也许在执行中?还是表现? yield from
会产生一个新的外部'迭代器?
我知道,在其他情况下,yield from
可以更灵活,因为我可以多次使用它,甚至可以将它与简单的yield
混合使用,但这对我的情况并不重要。
答案 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