2

我正在玩一些 Hack 并尝试使用yield关键字创建生成器函数。该文档指出,此类函数的返回类型应该是Continuation接口。但是,在hh_client生成器函数的源代码示例上运行时,我得到以下输出:

./test.php:4:3,7: 无效产量 (Typing[4110])
./test.php:3:17,28: 这是一个 Continuation 类型的对象
./test.php:4:3,7 :它与 Generator 类型的对象不兼容(主体中带有“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提供更多警告。输入生成器函数的正确方法是什么?

4

1 回答 1

4

文档中提到的任何内容Continuation都已过时且错误。关于它有一个未解决的问题

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

$r = yield $k => $v;

该生成器的类型是Generator<Tk, Tv, Ts>,其中Tk是 的类型$kTv是 的类型$vTs是 的类型$r

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

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

第一个int是因为隐含一个整数键;第二个int因为你是yielding ints,void因为你不关心什么值被发送到生成器中。

于 2015-04-14T00:04:48.973 回答