Pergunta

Em a linguagem Hack sistema de tipos, existe um tipo "superior", também conhecido como tipo "qualquer" ou um tipo "Objeto" universal?Ou seja, um tipo do qual todos os tipos são subclasses?

O manual menciona tipos "mistos", que podem ser semelhantes, mas não são realmente explicados.Existe também a possibilidade de simplesmente omitir a declaração de tipo em alguns locais.No entanto, isso não pode ser feito em todos os lugares, por ex.se eu quiser declarar algo como uma função de string para o tipo superior, não está claro como faço isso. function (string): mixed?

Foi útil?

Solução

Sou um engenheiro trabalhando com Hack no Facebook.Esta é uma pergunta realmente perspicaz e interessante.Dependendo exatamente do que você quer dizer, o Hack tem algumas variações diferentes disso.

Primeiro, vamos falar sobre mixed.É o supertipo de tudo.Por exemplo, este tipo verifica:

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

Mas como é o supertipo de tudo, você não pode fazer muito com um mixed valor até você analisar o que realmente é, via is_int, instanceof, etc.Aqui está um exemplo de como você teria que usar o resultado de f():

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

O tipo "anotação ausente" ("qualquer") é um pouco diferente disso.Enquanto mixed é o supertipo de tudo, "qualquer" unifica com tudo - é tanto o supertipo e subtipo de tudo.Isso significa que se você omitir uma anotação, presumiremos que você sabe o que está fazendo e deixaremos passar.Por exemplo, o seguinte código verifica como está escrito:

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

Claramente, isso não é correto - apenas quebramos o sistema de tipos e causaremos um erro de tipo em tempo de execução se executarmos o código acima - mas é admitido em modo parcial para facilitar a conversão.Estrito requer que você anote tudo e, portanto, você não pode obter um valor do tipo "qualquer" para quebrar o sistema de tipos dessa maneira se todo o seu código estiver estrito.Considere como você teria que anotar o código acima no modo estrito:qualquer f2 teria que voltar int e isso seria um erro de tipo direto ("string não é compatível com int"), ou f2 teria que voltar mixed e isso seria um erro de tipo conforme escrito ("string não é compatível com misto") até que você fizesse uma análise de caso com is_int etc como fiz no meu exemplo anterior.

Espero que isso esclareça as coisas - se você quiser esclarecimentos, deixe-me saber nos comentários e eu editarei.E se você tiver outras perguntas que não sejam esclarecimentos estritos sobre isso, continue marcando-as como "hacklang" e garantiremos que elas sejam respondidas!

Finalmente:se não se importar, você poderia pressionar "arquivar um bug de documentação" nas páginas de documentos que eram confusas ou pouco claras, ou que poderiam de alguma forma ser melhoradas?Idealmente, queremos que docs.hhvm.com seja um lugar único para coisas como essa, mas definitivamente há lacunas nos documentos que esperamos que pessoas inteligentes e entusiasmadas como você ajudem a apontar.(ou seja, achei que essas coisas foram bem explicadas na documentação, mas como você está confuso, esse claramente não é o caso, e gostaríamos muito de receber um relatório de bug detalhando onde você se perdeu.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top