ハック言語の上のタイプは何ですか?
-
21-12-2019 - |
質問
マニュアルの表現「ミックス」タイプは、似ている可能性がありますが、本当に説明されていません。一部の場所でタイプ宣言を省略するだけでもある可能性もあります。しかし、これはどこにでもやることはできません。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がこのようなもののためのワンストップの場所になることを望んでいますが、私たちが賢く、自分のような熱狂的な人々が指摘するのに役立ちます。 (すなわち、私はこのことがドキュメントでよく説明されたと思いましたが、あなたが明らかにそうではないと私たちは本当にあなたが紛失した場所を詳述するバグ報告に本当に感謝しているので、私たちは本当に感謝しているので、私たちは本当に感謝しています。)