Frage

In die Hack-Sprache typsystem, gibt es einen "Top" -Typ, der auch als "beliebiger" Typ bezeichnet wird, oder einen universellen "Objekt" -Typ?Das heißt, ein Typ, von dem alle Typen Unterklassen sind?

Das Handbuch erwähnt "gemischte" Typen, die ähnlich sein könnten, aber nicht wirklich erklärt werden.Es besteht auch die Möglichkeit, die Typdeklaration an einigen Stellen einfach wegzulassen.Dies ist jedoch nicht überall möglich, z.wenn ich etwas als Funktion deklarieren möchte von string für den Top-Typ ist nicht klar, wie ich das mache. function (string): mixed?

War es hilfreich?

Lösung

Ich bin ein Ingenieur, der bei Facebook an Hack arbeitet.Das ist eine wirklich aufschlussreiche und interessante Frage.Je nachdem, worauf Sie genau hinauswollen, hat Hack ein paar verschiedene Variationen davon.

Lass uns zuerst darüber reden mixed.Es ist der Supertyp von allem.Zum Beispiel überprüft dieser Typ:

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

Aber da es der Supertyp von allem ist, kann man mit einem nicht viel anfangen mixed wert, bis Sie Fall analysieren, was es tatsächlich ist, über is_int, instanceof, usw.Hier ist ein Beispiel dafür, wie Sie das Ergebnis von verwenden müssten f():

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

Der Typ "fehlende Anmerkung" ("beliebig") unterscheidet sich etwas davon.Während mixed ist der Supertyp von allem, "any" vereinheitlichen mit allem - es ist sowohl der Supertyp und subtyp von allem.Das heißt, wenn Sie eine Anmerkung weglassen, gehen wir davon aus, dass Sie wissen, was Sie tun, und lassen es einfach passieren.Zum Beispiel überprüft der folgende Code-Typ wie geschrieben:

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

Dies ist eindeutig nicht stichhaltig - wir haben nur das Typsystem beschädigt und verursachen einen Laufzeittypfehler, wenn wir den obigen Code ausführen - aber es wird im Teilmodus zugelassen, um die Konvertierung zu erleichtern.Strict erfordert, dass Sie alles mit Anmerkungen versehen, und daher können Sie keinen Wert vom Typ "any" erhalten, um das Typsystem auf diese Weise zu unterbrechen, wenn Ihr gesamter Code streng ist.Überlegen Sie, wie Sie den obigen Code im strikten Modus mit Anmerkungen versehen müssten:entweder f2 müsste zurückkehren int und das wäre ein direkter Typfehler ("string ist nicht kompatibel mit int") oder f2 müsste zurückkehren mixed und das wäre ein Typfehler wie geschrieben ("string ist nicht kompatibel mit mixed"), bis Sie eine Fallanalyse mit durchgeführt haben is_int usw. wie ich es in meinem vorherigen Beispiel getan habe.

Hoffe, das klärt die Dinge auf - wenn Sie eine Klarstellung wünschen, lassen Sie es mich in den Kommentaren wissen und ich werde es bearbeiten.Und wenn Sie andere Fragen haben, die keine strikten Klarstellungen sind, markieren Sie sie weiterhin mit "hacklang" und wir werden sicherstellen, dass sie beantwortet werden!

Schließlich:wenn es Ihnen nichts ausmacht, könnten Sie auf den Dokumentationsseiten, die verwirrend oder unklar waren oder in irgendeiner Weise verbessert werden könnten, auf "Dokumentationsfehler melden" klicken?Idealerweise wollen wir docs.hhvm.com für solche Dinge eine Anlaufstelle zu sein, aber es gibt definitiv Lücken in den Dokumenten, von denen wir hoffen, dass kluge, enthusiastische Leute wie Sie darauf hinweisen.(dh ich dachte, dieses Zeug wurde in den Dokumenten gut erklärt, aber da Sie verwirrt sind, ist dies eindeutig nicht der Fall, und wir würden uns sehr über einen Fehlerbericht freuen, in dem detailliert beschrieben wird, wo Sie sich verlaufen haben.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top