我正在尝试使用Hack,尝试使用yield
关键字创建生成器函数。 documentation表示此类函数的返回类型应为Continuation
接口。但是,当在生成器函数的源代码示例上运行hh_client
时,我得到以下输出:
./ test.php:4:3,7:收益率无效(打字[4110])
./test.php:3:17,28:这是Continuation类型的对象 ./test.php:4:3,7:它与Generator类型的对象不兼容(函数的结果与'在体内产生')
这是test.php:
<?hh
function gen(): Generator<int> {
yield 1;
yield 2;
yield 3;
}
function foo(): void {
foreach (gen() as $x) {
echo $x, "\n";
}
}
foo();
将结果类型更改为Generator
会发出更多警告。输入生成器函数的正确方法是什么?
答案 0 :(得分:4)
文档中提及Continuation
的内容已经过时且错误。有an open issue about it。
正确的类型是Generator<Tk, Tv, Ts>
- 实际上有三种类型参数。以下是他们的意思的一个例子:
$r = yield $k => $v;
该生成器的类型为Generator<Tk, Tv, Ts>
,其中Tk
的类型为$k
,Tv
的类型为$v
,{{1是Ts
的类型。
对于您的代码,这应该有效:
$r
第一个function gen(): Generator<int, int, void> {
yield 1;
yield 2;
yield 3;
}
因为隐含了一个整数键;第二个int
,因为您int
yield
和int
,因为您不关心将哪些值发送到生成器。