"yield"覆盖"yield from"项目

  • 本文关键字:yield 项目 覆盖 from php
  • 更新时间 :
  • 英文 :

<?php
function generator1(): Traversable
{
yield 'alpha';
yield 'beta';
yield 'delta';
}
function generator2(): Traversable
{
yield from generator1();
yield 'upsilon';
yield 'omega';
}
function resolve(iterable $generator) {
foreach ($generator as $index => $item) 
echo "$index $item" . PHP_EOL;
}
resolve(generator1());
echo  PHP_EOL;
resolve(generator2());
die;

产生如下结果:

0 alpha
1 beta
2 delta
0 alpha
1 beta
2 delta
0 upsilon
1 omega

最后一个流应该是:

0 alpha
1 beta
2 delta
3 upsilon
4 omega

这是怎么回事?这是PHP中的一个错误(我在Ubuntu中运行v7.4.10)。我如何得到正确的结果,而不使用数组或其他形式的收集器?

结果是iterator_to_array()函数的特性。第二个参数必须设置为false,以便所有值都记录在注释中。

在PHP手册中也特别指出了这一点。

function generator1(): Traversable
{
yield 'alpha';
yield 'beta';
yield 'delta';
yield 'gamma';
yield 'epsilon';
yield 'eta';
}
function generator2(): Traversable
{
yield from generator1();
yield 'upsilon';
yield 'omega';
}
var_dump(iterator_to_array(generator2()));
var_dump(iterator_to_array(generator2(), false));

结果:

array(6) {
[0]=>
string(7) "upsilon"
[1]=>
string(5) "omega"
[2]=>
string(5) "delta"
[3]=>
string(5) "gamma"
[4]=>
string(7) "epsilon"
[5]=>
string(3) "eta"
}
array(8) {
[0]=>
string(5) "alpha"
[1]=>
string(4) "beta"
[2]=>
string(5) "delta"
[3]=>
string(5) "gamma"
[4]=>
string(7) "epsilon"
[5]=>
string(3) "eta"
[6]=>
string(7) "upsilon"
[7]=>
string(5) "omega"
}

在沙箱里自己试一试。

当使用foreach输出键和值时,这一点变得清晰。

foreach(generator2() as $key => $value){
var_dump($key,$value);
}

输出:

int(0) string(5) "alpha"
int(1) string(4) "beta"
int(2) string(5) "delta"
int(3) string(5) "gamma"
int(4) string(7) "epsilon"
int(5) string(3) "eta"
int(0) string(7) "upsilon"
int(1) string(5) "omega"

最新更新