根据PHP文档,在生成器类的::send()
方法中传递的变量被赋值为yield关键字。
在以下陈述中有意义:
$v = yield;
但是如下的陈述呢?
$v = yield $a;
yield关键字已经分配,它将返回传入的变量。那么$a
做了什么?
我试图解决这个问题,并搜索了许多帖子和问题,但没有人解释这一点。
答案 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();
<强>结果:强>
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
的输入和输出。在调用代码中,可以通过调用$foo
或yield $foo
或获取$bar = yield $foo
中的值来访问->next()
或->current()
的{{1}}部分}。调用代码然后调用foreach
,其值为->send()
或$bar
中的$bar = yield
。