【发布时间】:2016-01-02 19:21:29
【问题描述】:
这是一个简单的 JavaScript 生成器(通过:http://blog.carbonfive.com/2013/12/01/hanging-up-on-callbacks-generators-in-ecmascript-6/)
function* powGenerator() {
var result = Math.pow(yield "a", yield "b");
return result;
}
var g = powGenerator();
console.log(g.next().value); // "a", from the first yield
console.log(g.next(10).value); // "b", from the second
console.log(g.next(2).value); // 100, the result
我正在尝试用 PHP 建模类似的东西,但这有点让人头疼。
<?php
function powGenerator() {
return pow((yield 'a'), (yield 'b'));
}
在我更进一步之前,我在 PHP 中遇到了这个错误
致命错误:生成器无法使用“return”返回值
好的,所以也许我会使用另一个收益来获得最终价值? ...
<?php
function powGenerator() {
yield pow((yield 'a'), (yield 'b'));
}
$g = powGenerator(); //=> Generator {#180}
echo $g->send(10); //=> "b"
echo $g->send(2); //=> 100
好的,所以我恢复了我的价值,但这里有两个主要问题
我的
"a"去哪儿了? — 请注意,在 JS 示例中,我能够访问"a"和"b"产生的值以及 @ 987654330@最终结果。-
生成器还没有完成! — 我必须再打电话给
send才能完成生成器$g->valid(); //=> true $g->send('?'); //=> null $g->valid(); //=> false
来自 PHP Generator::send
public mixed Generator::send ( mixed $value )将给定值作为当前
yield表达式的结果发送到生成器,并继续执行生成器。如果调用此方法时生成器不在
yield表达式中,则在发送值之前,它会先让其前进到第一个yield表达式。因此,没有必要使用Generator::next() 调用“启动”PHP 生成器(就像在 Python 中所做的那样)。
强调“因此没有必要使用Generator::next() 来“启动”PHP 生成器”。好的,但这到底是什么意思?我不必像 JavaScript 示例那样“启动”它,但第一个产生的值也被吞没了。
谁能解释一下你是如何不使用使用foreach来单步调试生成器的?
【问题讨论】: