首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >` from from $generator`和` `return $generator`?

` from from $generator`和` `return $generator`?
EN

Stack Overflow用户
提问于 2016-05-12 21:23:19
回答 2查看 4.9K关注 0票数 13

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

代码语言:javascript
复制
function foo()
{
    $generator = getGenerator();
    // some other stuff (no yields!)
    yield from $generator;
}

如果我用一个简单return替换这个yield from,在这种情况下会有什么变化吗?也许是在行刑的时候?还是性能?yield from会产生一个新的‘外部’迭代器吗?

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

EN

回答 2

Stack Overflow用户

发布于 2017-05-23 22:36:22

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-04-17 07:43:05

在您的示例中,将yield from更改为return会得到相同的结果。但是,如果在return之前有yield语句,它不会组合来自getGenerator()的值。

代码语言:javascript
复制
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";
}

输出:

代码语言:javascript
复制
testing gen_2
1
testing gen_3
2
testing gen_4
2
1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37188263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档