【问题标题】:How to properly type a generator function in Hack如何在 Hack 中正确键入生成器函数
【发布时间】:2015-04-13 08:56:05
【问题描述】:

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

./test.php:4:3,7: 无效的产量(打字[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 会给出更多警告。输入生成器函数的正确方法是什么?

【问题讨论】:

标签: hhvm hacklang


【解决方案1】:

文档中对Continuation 的任何提及都是过时且错误的。有an open issue about it

正确的类型是Generator&lt;Tk, Tv, Ts&gt;——那里实际上有三个类型参数。以下是它们含义的示例:

$r = yield $k => $v;

那个生成器的类型是Generator&lt;Tk, Tv, Ts&gt;,其中Tk$k的类型,Tv$v的类型,Ts$r的类型。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2016-04-09
    • 2016-09-12
    • 2018-01-30
    • 2021-07-28
    相关资源
    最近更新 更多