Domanda

in Il linguaggio di hacking del tipo, c'è un tipo "Top", noto anche come un"Qualsiasi tipo" o tipo "oggetto" universale?Cioè, un tipo che tutti i tipi sono sottoclassi di?

Il manuale menziona i tipi "misti" , che potrebbe essere simile, maNon è davvero spiegato.C'è anche la possibilità di semplicemente omettere la dichiarazione del tipo in alcuni punti.Tuttavia, questo non può essere fatto ovunque, ad es.Se voglio dichiarare qualcosa da essere una funzione da string al tipo superiore, non è chiaro come lo faccio.function (string): mixed?

È stato utile?

Soluzione

Sono un ingegnere che lavora a Hack at Facebook. Questa è una domanda davvero perspicace e interessante. A seconda di cosa stai facendo esattamente, hack ha un paio di diverse varianti di questo.

In primo luogo, parliamo di mixed. È la supertype di tutto. Ad esempio, questo typechecks:

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

Ma dal momento che è la supertype di tutto, non puoi fare molto con un valore mixed fino a quando non ti analizzi su ciò che è in realtà, tramite is_int, instanceof, ecc. Ecco un esempio di come avresti dovuto usare il Risultato di f():

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

Il tipo "Annotazione mancante" ("qualsiasi") è in qualche modo diverso da questo. Considerando che mixed è il supertype di tutto, "qualsiasi" unifica con tutto - è sia il sottotipo della supertype e del sottotipo di tutto. Ciò significa che se si lascia un'annotazione, supponeremo che tu sappia cosa stai facendo e lascia che il passaggio. Ad esempio, il seguente codice tipografo come scritto:

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

Questo chiaramente non è il suono - abbiamo appena rotto il sistema di tipo e causerà un errore di tipo di runtime se eseguiamo il codice sopra riportato, ma è ammesso in modalità parziale per facilitare la conversione. Strict richiede di annotare tutto, e quindi non è possibile ottenere un valore di tipo "qualsiasi" per interrompere il sistema di tipo in questo modo se tutto il tuo codice è rigido. Considera come avresti dovuto annotare il codice sopra in modalità rigorosa: il f2 dovrebbe restituire int e questo sarebbe un errore di tipo diligente (la stringa non è compatibile con int ") o f2 dovrebbe restituire mixed E questo sarebbe un errore di tipo come scritto ("String String non è compatibile con misto") finché non hai fatto un'analisi del caso con is_int ecc. Come ho fatto nel mio precedente esempio.

Spero che questo chiarisca le cose - se vuoi chiarire il chiarimento fammi sapere nei commenti e io verrò. E se hai altre domande che non sono rigorose chiarimenti, continua a taggare loro "Hacklang" e ci assicureremo che vengano risposto!

Infine: se non ti dispiacerebbe, potresti premere il "bug di documentazione del file" sulle pagine dei documenti che sono state confuse o non chiare, o potrebbero in alcun modo essere migliorata? Voglio idealmente Docs.Hhvm.com di essere un posto one-stop per cose come questo, ma ci sono sicuramente buchi nei documenti che speriamo che folli intelligenti e entusiasti come te stesso aiuteranno sottolineare. (cioè, pensavo che questa roba sia stata spiegata bene nei documenti, ma dal momento che sei confuso che non è chiaramente il caso, e apprezzeremo davvero un segnale di bug in dettaglio in cui ti sei perso.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top