Hack程序员是否使用运行时断言?

时间:2016-01-30 04:18:34

标签: assertions hacklang

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

<?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的政策是什么,但我知道这是不是秘密。)

1 个答案:

答案 0 :(得分:2)

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

建议使用assert,因为它是eval的配置控制版本。相反,Hack引入了invariant函数,您可以使用该函数向类型检查器提供信息,您知道它是真实的,但它无法弄清楚。始终在运行时检查对invariant的调用,如果失败则会抛出异常。

因此,在您的示例中,我不会进行任何其他检查,因为add_one("yes");调用在运行时已经导致错误。