2

Hack で少し遊んで、yieldキーワードを使用してジェネレーター関数を作成しようとしました。ドキュメントには、そのような関数の戻り値の型はContinuationインターフェイスである必要があると記載されています。ただし、hh_clientジェネレーター関数のソース コード例を実行すると、次の出力が得られます。

./test.php:4:3,7: 無効な yield (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>、実際には 3 つの型パラメーターがあります。これらの意味の例を次に示します。

$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理由は、暗黙的に整数キーがあるためです。2 つ目はsをingしintているためであり、ジェネレーターに送信される値を気にしないためです。yieldintvoid

于 2015-04-14T00:04:48.973 に答える