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

  • 本文关键字:函数 Hack hhvm hacklang
  • 更新时间 :
  • 英文 :


我玩了一会儿 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是因为您不关心将哪些值发送到生成器。

相关内容

  • 没有找到相关文章

最新更新