右边的变量在yield表达式中做了什么?

时间:2018-03-26 08:21:29

标签: php

根据PHP文档,在生成器类的::send()方法中传递的变量被赋值为yield关键字。

在以下陈述中有意义:

$v = yield;

但是如下的陈述呢?

$v = yield $a;

yield关键字已经分配,​​它将返回传入的变量。那么$a做了什么?

我试图解决这个问题,并搜索了许多帖子和问题,但没有人解释这一点。

3 个答案:

答案 0 :(得分:0)

自己回答......

$ v =收益$ a;

意思是,首先按照通常的方式产生$ a,然后将send()方法传递的变量赋值给$ v。

仍然无法得到明确的解释。但我认为这有点可以解决这个问题。

答案 1 :(得分:0)

使用send()将定义$v,因此如果您使用$v = yield $a;并且在迭代之前,您使用send()发送了一个值,它将生成您发送的值。

可能很难理解,所以这里有一个例子,它创建了两个部分,foreach迭代器循环生成器,然后在迭代10它向while循环发送一个停止。然后使用getReturn获取yield的最后一个值,例如$v中的$v = yield $a;

<?php
$engine = function($callback) {
    $i = 0;
    while (true) {
        $state = (yield $callback($i++));
        if ($state == 'stop') {
            return $i;
        }
    }
};

$generator = $engine(function($i) {
    return $i;
});

foreach ($generator as $value) {
    echo "{$generator->key()} = {$value}\n";

    if ($generator->key() == 10) {
        $generator->send('stop');
    }
}

echo 'Stopped on: '.$generator->getReturn();

https://3v4l.org/dY8rV

<强>结果:

0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = 10
Stopped on: 11

答案 2 :(得分:0)

yield关键字可用于三件事:

  • 单独将控制暂时返回到调用代码。这是所有其他用途的基础。
  • 使用(yield $foo)之后的值,将变量传递给调用代码。
  • 使用之前的作业($bar = yield),从调用代码接收变量

这些类似于如何使用函数调用:

  • doSomething()一样,可以将控件暂时传递给doSomething的定义。
  • 使用参数(如doSomething($foo))将变量传递给函数。
  • 之前的作业,例如$var = doSomething(),可以从函数接收变量

您希望撰写$bar = doSomething($foo);以便将$foo传递给某个函数,并在之后获取$bar$bar = yield $foo是类似的,但是值被“out”传递给调用代码,之后从该调用代码接收到新值。

$foo$bar没有任何关联,它们只是特定yield的输入和输出。在调用代码中,可以通过调用$fooyield $foo或获取$bar = yield $foo中的值来访问->next()->current()的{​​{1}}部分}。调用代码然后调用foreach,其值为->send()$bar中的$bar = yield