1

在无类型语言中,运行时断言可以捕获“类型错误”:

<?php
function add_one($x) {
  assert(is_int($x));
  return $x+1;
}
?>

使用 Hack 的类型注释,我想删除断言,但这是不安全的,因为非类型化代码仍可能调用类型化函数。

<?hh // strict
function add_one(int $x): int {
  return $x+1;
}

function evil(): void {
  // UNSAFE
  add_one("yes"); // Runtime error!
}
?>

对于任何专业的 Hack 开发人员:您是否使用断言强制执行类型签名?(我真的很想知道 Facebook 的政策是什么,但我知道这是否是一个秘密。)

4

1 回答 1

3

在运行时未能满足类型签名会引发E_RECOVERABLE_ERROR. 你如何处理这取决于你的错误处理程序。

建议不要使用assert,因为它是eval. 相反,Hack 引入了该invariant功能,您可以使用该功能向类型检查器提供您知道是正确但无法弄清楚的信息。调用invariant总是在运行时检查,如果调用失败将抛出异常。

所以,在你的例子中,我不会有任何额外的检查,因为add_one("yes");调用已经在运行时导致错误。

于 2016-01-30T10:39:05.320 回答