我玩了一会儿 Hack,并尝试使用 yield
关键字创建一个生成器函数。文档指出,此类函数的返回类型应为 Continuation
接口。但是,当在生成器函数的源代码示例上运行hh_client
时,我得到以下输出:
./test.php:4:3,7:无效的产量(键入[4110])
./test.php:3:17,28:这是一个类型为延续
的对象 ./test.php:4:3,7:它与生成器类型的对象不兼容(体内具有"屈服"的功能的结果)
这是测试.php:
<?hh
function gen(): Generator<int> {
yield 1;
yield 2;
yield 3;
}
function foo(): void {
foreach (gen() as $x) {
echo $x, "n";
}
}
foo();
将结果类型更改为Generator
会发出更多警告。输入生成器函数的正确方法是什么?
文档中任何提及Continuation
的内容都是过时的和错误的。关于它有一个悬而未决的问题。
正确的类型是Generator<Tk, Tv, Ts>
- 实际上有三个类型参数。以下是它们含义的示例:
$r = yield $k => $v;
该生成器的类型是Generator<Tk, Tv, Ts>
,其中Tk
是$k
的类型,Tv
是$v
的类型,Ts
是$r
的类型。
对于您的代码,这应该有效:
function gen(): Generator<int, int, void> {
yield 1;
yield 2;
yield 3;
}
第一个int
是因为有一个隐式的整数键;第二个int
是因为您yield
int
s,void
是因为您不关心将哪些值发送到生成器。