php – 如何产生空发生器?
作者:互联网
我有一个方法,它采用一个生成器加上一些额外的参数,并产生一个新的生成器:
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