質問

HACK Language タイプシステムは、「トップ」タイプもあります。「任意の」タイプ、またはユニバーサル「オブジェクト」タイプ?つまり、すべてのタイプがサブクラスのサブクラスである?

マニュアルの表現「ミックス」タイプは、似ている可能性がありますが、本当に説明されていません。一部の場所でタイプ宣言を省略するだけでもある可能性もあります。しかし、これはどこにでもやることはできません。stringからトップタイプへの関数になるように何かを宣言したい場合は、これを実行する方法は明らかではありません。function (string): mixed

役に立ちましたか?

解決

私はFacebookでハックに取り組んでいるエンジニアです。これは本当に洞察的で興味深い質問です。あなたが到着していることに応じて、ハックにはこれが異なるバリエーションがいくつかあります。

最初に、mixedについて話しましょう。それはすべてのスーパータイプです。たとえば、このTypeChecks:

<?hh // strict
function f(): mixed {
  return 42;
}
.

しかし、それがすべてのスーパータイプであるため、実際にそれが実際にあるものであることを事例から分析するまで多くのことはできません。これは、ここに使用する方法の例です。 mixedの結果:

<?hh // strict
function g(): int {
  $x = f();
  if (is_int($x)) {
    return $x;
  } else {
    return 0;
  }
}
.

「注釈の欠落」タイプ(「any」)はこれと多少異なります。 is_intはすべてのスーパータイプです。 "任意の" を統一します - それはすべてのスーパータイプのサブタイプです。つまり、注釈を除外すると、あなたがしていることを知っているだけで通過させるだけです。たとえば、書かれているとおりに次のコードを入力します。

<?hh
// No "strict" since we are omitting annotations
function f2() {
  return 42;
}
function g2(): string {
  return f2();
}
.

これは音ではない - 上記のコードを実行した場合はタイプシステムを破り、実行時のタイプエラーが発生しますが、変換を容易にするために部分モードで認められます。厳格には、すべてに注釈を付ける必要があるため、この方法でタイプシステムを破るために「ANY」と入力することはできません。すべてのコードが厳密になっている場合上記のコードを厳密に注釈に注釈を付けなければならないことを検討してください.instanceofのいずれかがf()を返す必要があり、それがストレインアップ型エラー( "文字列はint"と互換性がありません)、またはmixedを返す必要があります。それは私の以前の例で私がしたようにf2 etcを使用したケース分析を行うまで、書かれているタイプエラーです( "Stringはミックスと互換性がありません)。

これが物事をクリアすることを願って - あなたが明確にしたいのであれば私にコメントを知らせてください、そして私は編集します。そして、あなたがこれを厳密な説明ではない他の質問がある場合は、それらを「Hacklang」にタグ付けし続けてください、そして、私たちは彼らが答えたことを確認します!

最後に気にしない場合は、混乱したり不明瞭なドキュメント・ページの「ドキュメントのバグ」を押すこともできます。私たちは理想的にdocs.hhvm.comがこのようなもののためのワンストップの場所になることを望んでいますが、私たちが賢く、自分のような熱狂的な人々が指摘するのに役立ちます。 (すなわち、私はこのことがドキュメントでよく説明されたと思いましたが、あなたが明らかにそうではないと私たちは本当にあなたが紛失した場所を詳述するバグ報告に本当に感謝しているので、私たちは本当に感謝しているので、私たちは本当に感謝しています。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top