我有一个返回生成器的函数。目前它使用的是yield from
function foo()
{
$generator = getGenerator();
// some other stuff (no yields!)
yield from $generator;
}如果我用一个简单return替换这个yield from,在这种情况下会有什么变化吗?也许是在行刑的时候?还是性能?yield from会产生一个新的‘外部’迭代器吗?
我知道,在其他情况下,yield from可以更灵活,因为我可以多次使用它,甚至可以将它与简单的yields混合使用,但这对我的情况并不重要。
发布于 2017-05-23 22:36:22
当您像上面那样在方法的末尾使用一次yield from时,这不会改变该方法返回的内容。但是方法内部的代码仍然有一个不同之处:在迭代开始时回绕迭代器时调用yield from之前的任何代码,而在调用函数时执行return之前的代码,因为这个函数现在只是一个普通的函数(实际上,这并不是yield from所特有的。这是yield的行为。有关证明,请参阅https://3v4l.org/jnPvC )。
yield from的最大优点是您可以在函数中多次使用它,将所有迭代器的值组合到一个迭代器中。
发布于 2018-04-17 07:43:05
在您的示例中,将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
1https://stackoverflow.com/questions/37188263
复制相似问题