ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 如何产生空发生器?

2019-10-07 14:38:25  阅读:193  来源: 互联网

标签:php language-design yield language-details


我有一个方法,它采用一个生成器加上一些额外的参数,并产生一个新的生成器:

function merge(\Generator $carry, array $additional)
{
    foreach ( $carry as $item ) {
        yield $item;
    }
    foreach ( $additional as $item ) {
        yield $item;
    }
}

此函数的常用用例与此类似:

function source()
{
    for ( $i = 0; $i < 3; $i++ ) {
        yield $i;
    }
}

foreach ( merge(source(), [4, 5]) as $item ) {
    var_dump($item);
}

但问题是有时我需要将空源传递给merge方法.理想情况下,我希望能够做到这样的事情:

merge(\Generator::getEmpty(), [4, 5]);

这正是我在C#中的表现(有一个IEnumerable< T> .Empty属性).但我没有看到任何一种空发电机in the manual.

我已经设法使用此函数解决此问题(现在):

function sourceEmpty()
{
    if ( false ) {
        yield;
    }
}

这很有效.编码:

foreach ( merge(sourceEmpty(), [4, 5]) as $item ) {
    var_dump($item);
}

正确输出:

int(4)
int(5)

但这显然不是一个理想的解决方案.将空生成器传递给merge方法的正确方法是什么?

解决方法:

有点迟了,但自己需要一个空发电机,并意识到创建一个实际上很容易……

function empty_generator(): Generator
{
    yield from [];
}

不知道这是否比使用EmptyIterator更好,但这样你至少可以获得与非空生成器完全相同的类型.

标签:php,language-design,yield,language-details
来源: https://codeday.me/bug/20191007/1867549.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有