黑客语言 类型系统,是否有“顶级”类型,也称为“任何”类型,或通用“对象”类型?也就是说,所有类型都是其子类的类型?

手册提到“混合”类型, ,这可能相似,但没有真正解释。还可以在某些地方简单地省略类型声明。然而,这不能在任何地方都完成,例如如果我想声明某个东西是一个函数 string 对于顶级类型,目前还不清楚我是如何做到这一点的。 function (string): mixed?

有帮助吗?

解决方案

我是一名在 Facebook 从事 Hack 工作的工程师。这是一个非常有洞察力和有趣的问题。根据您具体要了解的内容,Hack 有几种不同的变体。

首先,我们来谈谈 mixed. 。它是一切的超类型。例如,此类型检查:

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

但由于它是所有事物的超类型,所以你不能用它做太多事情 mixed 价值,直到你对它实际上是什么进行案例分析,通过 is_int, instanceof, , ETC。这是一个如何使用结果的示例 f():

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

“缺少注释”类型(“any”)与此有些不同。然而 mixed 是一切的超类型,“any” 统一 与一切——它都是超类型 一切的子类型。这意味着,如果您省略注释,我们会假设您知道自己在做什么,然后就让它过去。例如,以下代码类型检查如下:

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

这显然不合理——我们只是破坏了类型系统,如果执行上面的代码,将会导致运行时类型错误——但为了简化转换,它在部分模式下被允许。严格要求您对所有内容进行注释,因此如果您的所有代码都是严格的,则无法以这种方式获取“any”类型的值来破坏类型系统。考虑一下如何在严格模式下注释上面的代码:任何一个 f2 必须返回 int 这将是一个直接的类型错误(“字符串与 int 不兼容”),或者 f2 必须返回 mixed 这将是一个所写的类型错误(“字符串与混合不兼容”),直到您进行案例分析 is_int 等等,就像我在前面的例子中所做的那样。

希望这能澄清问题——如果您需要澄清,请在评论中告诉我,我会进行编辑。如果您还有其他问题没有严格澄清,请继续将它们标记为“hacklang”,我们将确保它们得到答复!

最后:如果您不介意,您可以在令人困惑或不清楚的文档页面上按“提交文档错误”,或者可以以任何方式进行改进吗?我们理想地希望 docs.hhvm.com 成为此类内容的一站式场所,但文档中肯定存在漏洞,我们希望像您这样聪明、热情的人能够帮助指出。(也就是说,我认为这些内容在文档中得到了很好的解释,但由于您感到困惑,显然情况并非如此,我们非常感谢详细说明您迷路的错误报告。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top