什么是哈克语言中的顶级类型



在Hack语言类型系统中,是否存在"top"类型,也称为"any"类型,或通用的"Object"类型?也就是说,一个所有类型都是其子类的类型?

手册中提到了"混合"类型,这些类型可能相似,但并没有真正解释。在某些地方还可以简单地省略类型声明。然而,这不可能在任何地方都做到,例如,如果我想声明某个东西是从string到top类型的函数,那么我不清楚如何做到这一点。function (string): mixed

我是一名在Facebook上从事黑客工作的工程师。这是一个非常有见地和有趣的问题。根据你到底在做什么,哈克有几个不同的变体。

首先,我们来谈谈mixed。它是所有事物的超类型。例如,此类型检查:

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

但是,由于它是所有事物的超类型,在通过is_intinstanceof等对mixed值进行案例分析之前,您无法对其进行太多处理。以下是如何使用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();
}

这显然不合理——我们刚刚破坏了类型系统,如果我们执行上面的代码,将导致运行时类型错误——但为了简化转换,它是以部分模式允许的。Strict要求对所有内容进行注释,因此如果所有代码都是严格的,则不能获得"any"类型的值来以这种方式破坏类型系统。考虑一下您必须如何在严格模式下注释上面的代码:要么f2必须返回int,这将是一个直接的类型错误("string与int不兼容"),要么f2必须返回mixed,这将在编写时是一个类型错误("string与mixed不兼容"),直到您像我在前面的示例中那样使用is_int等进行案例分析。

希望这能澄清问题——如果你想澄清,请在评论中告诉我,我会编辑的。如果你还有其他问题没有严格澄清,请继续给他们贴上"hacklang"的标签,我们会确保他们得到回复!

最后:如果你不介意的话,你能在令人困惑或不清楚的文档页面上按下"归档文档错误"吗?或者可以以任何方式改进吗?理想情况下,我们希望docs.hhvm.com成为此类内容的一站式网站,但我们希望像你这样聪明、热情的人能帮助指出文档中的漏洞。(也就是说,我认为这些东西在文档中解释得很好,但由于您感到困惑,事实显然并非如此,我们非常感谢一份详细说明您丢失位置的错误报告。)

相关内容

  • 没有找到相关文章

最新更新