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

Hhvm 如何在Hack中正确键入生成器函数,hhvm,hacklang,Hhvm,Hacklang,我正在和Hack玩一会儿,并尝试使用yield关键字创建一个生成器函数。声明这样一个函数的返回类型应该是Continuation接口。但是,在generator函数的源代码示例上运行hh_client时,我得到以下输出: ./test.php:4:3,7:Invalid yield类型[4110] ./test.php:3:17,28:这是一个Continuation类型的对象 ./test.php:4:3,7:它与主体中带有“yield”的函数的生成器结果类型的对象不兼容 这是test.php

我正在和Hack玩一会儿,并尝试使用yield关键字创建一个生成器函数。声明这样一个函数的返回类型应该是Continuation接口。但是,在generator函数的源代码示例上运行hh_client时,我得到以下输出:

./test.php:4:3,7:Invalid yield类型[4110] ./test.php:3:17,28:这是一个Continuation类型的对象 ./test.php:4:3,7:它与主体中带有“yield”的函数的生成器结果类型的对象不兼容

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

文档中提到的任何延续都是过时和错误的。有一个

正确的类型是Generator-实际上有三个类型参数。这里有一个例子说明了它们的含义:

$r = yield $k => $v;
该生成器的类型是generator,其中Tk是$k的类型,Tv是$v的类型,Ts是$r的类型

对于您的代码,这应该是可行的:

function gen(): Generator<int, int, void> {
  yield 1;
  yield 2;
  yield 3;
}

第一个int,因为隐式存在一个整数键;第二个int是因为您正在生成int,而void是因为您不关心将哪些值发送到生成器。

您是否在没有结果类型的情况下尝试过它?就像在文档中一样,是的,这是有效的,但有点违背了目的。为了能够将脚本定义为strict hack,必须定义返回类型。