如何在Hack中正确键入生成器函数

时间:2015-04-13 08:56:05

标签: hhvm hacklang

我正在尝试使用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会发出更多警告。输入生成器函数的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

文档中提及Continuation的内容已经过时且错误。有an open issue about it

正确的类型是Generator<Tk, Tv, Ts> - 实际上有三种类型参数。以下是他们的意思的一个例子:

$r = yield $k => $v;

该生成器的类型为Generator<Tk, Tv, Ts>,其中Tk的类型为$kTv的类型为$v,{{1是Ts的类型。

对于您的代码,这应该有效:

$r

第一个function gen(): Generator<int, int, void> { yield 1; yield 2; yield 3; } 因为隐含了一个整数键;第二个int,因为您int yieldint,因为您不关心将哪些值发送到生成器。