首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"yield“覆盖"yield”项

"yield“覆盖"yield”项
EN

Stack Overflow用户
提问于 2021-09-19 23:34:17
回答 1查看 63关注 0票数 4
代码语言:javascript
复制
<?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;

产生以下结果:

代码语言:javascript
复制
0 alpha
1 beta
2 delta

0 alpha
1 beta
2 delta
0 upsilon
1 omega

最后一个流应该是:

代码语言:javascript
复制
0 alpha
1 beta
2 delta
3 upsilon
4 omega

这里发生了什么事?这是PHP中的bug吗(我在Ubuntu中运行的是v7.4.10 )。如何在不使用数组或其他形式的收集器的情况下获得正确的结果?

EN

回答 1

Stack Overflow用户

发布于 2021-09-20 06:09:42

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

PHP manual中也特别指出了这一点。

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

结果:

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

Try for yourself in the sandbox.

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

代码语言:javascript
复制
foreach(generator2() as $key => $value){
  var_dump($key,$value);
}

输出:

代码语言:javascript
复制
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"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69247807

复制
相关文章

相似问题

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