Pregunta

En el lenguaje Hack sistema de tipos, ¿existe un tipo "superior", también conocido como tipo "cualquiera", o un tipo de "Objeto" universal?Es decir, ¿un tipo del que todos los tipos son subclases?

El manual menciona tipos "mixtos" , que podrían ser similares, pero en realidad no se explican.También existe la posibilidad de simplemente omitir la declaración de tipo en algunos lugares.Sin embargo, esto no se puede hacer en todas partes, p. ej.si quiero declarar que algo es una función de string para el tipo superior, no está claro cómo hago esto. function (string): mixed?

¿Fue útil?

Solución

Soy un ingeniero que trabaja en Hackear en Facebook.Esta es una pregunta realmente perspicaz e interesante.Dependiendo de a qué se dirija exactamente, Hack tiene un par de variaciones diferentes de esto.

Primero, hablemos de mixed.Es el supertipo de todo.Por ejemplo, este typechecks:

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

Pero dado que es el supertipo de todo, no puedes hacer mucho con un mixed valor hasta que analice el caso de lo que realmente es, a través de is_int, instanceof, etc.Aquí hay un ejemplo de cómo tendría que usar el resultado de f():

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

El tipo " anotación faltante "("cualquiera") es algo diferente a esto.Considerando que mixed es el supertipo de todo, "cualquiera" unifica con todo it es a la vez el supertipo y subtipo de todo.Esto significa que si omites una anotación, asumiremos que sabes lo que estás haciendo y simplemente la dejarás pasar.Por ejemplo, el siguiente tipo de códigocomprueba tal como está escrito:

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

Claramente, esto no es sólido: acabamos de romper el sistema de tipos y provocaremos un error de tipo de tiempo de ejecución si ejecutamos el código anterior, pero se admite en modo parcial para facilitar la conversión.Strict requiere que anotes todo, por lo que no puedes obtener un valor de tipo "any" para romper el sistema de tipos de esta manera si todo tu código está en strict.Considere cómo tendría que anotar el código anterior en modo estricto:tampoco f2 tendría que volver int y eso sería un error de tipo directo ("string no es compatible con int"), o f2 tendría que volver mixed y eso sería un error de tipo tal como está escrito ("la cadena no es compatible con mixed") hasta que realizó un análisis de caso con is_int etc. como hice en mi ejemplo anterior.

Espero que esto aclare las cosas if si quieres una aclaración, házmelo saber en los comentarios y editaré.Y si tiene otras preguntas que no son aclaraciones estrictas de esto, continúe etiquetándolas como "hacklang" y nos aseguraremos de que se respondan.

Por último:si no le importara, ¿podría presionar "presentar un error de documentación" en las páginas de documentos que eran confusas o poco claras, o que podrían mejorarse de alguna manera?Idealmente queremos docs.hhvm.com ser un lugar único para cosas como esta, pero definitivamente hay agujeros en los documentos que esperamos que personas inteligentes y entusiastas como usted ayuden a señalar.(es decir, pensé que esto estaba bien explicado en los documentos, pero como estás confundido, claramente ese no es el caso, y realmente agradeceríamos un informe de error que detallara dónde te perdiste.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top