在Hack语言类型系统中,是否存在"top"类型,也称为"any"类型,或通用的"Object"类型?也就是说,一个所有类型都是其子类的类型?
手册中提到了"混合"类型,这些类型可能相似,但并没有真正解释。在某些地方还可以简单地省略类型声明。然而,这不可能在任何地方都做到,例如,如果我想声明某个东西是从string
到top类型的函数,那么我不清楚如何做到这一点。function (string): mixed
?
我是一名在Facebook上从事黑客工作的工程师。这是一个非常有见地和有趣的问题。根据你到底在做什么,哈克有几个不同的变体。
首先,我们来谈谈mixed
。它是所有事物的超类型。例如,此类型检查:
<?hh // strict
function f(): mixed {
return 42;
}
但是,由于它是所有事物的超类型,在通过is_int
、instanceof
等对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成为此类内容的一站式网站,但我们希望像你这样聪明、热情的人能帮助指出文档中的漏洞。(也就是说,我认为这些东西在文档中解释得很好,但由于您感到困惑,事实显然并非如此,我们非常感谢一份详细说明您丢失位置的错误报告。)