Hack 程序员使用运行时断言吗?
Do Hack programmers use runtime assertions?
在无类型语言中,运行时断言可以捕获 "type errors":
<?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 的政策是什么,但我知道这是不是秘密。)
在 运行 时未能满足类型签名会引发 E_RECOVERABLE_ERROR
。你如何处理这取决于你的错误处理程序。
不建议使用 assert
,因为它是 eval
的配置控制版本。相反,Hack 引入了 invariant
函数,您可以使用它向类型检查器提供您知道是正确但它无法弄清楚的信息。对 invariant
的调用总是在 运行 时检查,如果失败将抛出异常。
因此,在您的示例中,我不会进行任何额外的检查,因为 add_one("yes");
调用已经在 运行 时导致错误。
在无类型语言中,运行时断言可以捕获 "type errors":
<?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 的政策是什么,但我知道这是不是秘密。)
在 运行 时未能满足类型签名会引发 E_RECOVERABLE_ERROR
。你如何处理这取决于你的错误处理程序。
不建议使用 assert
,因为它是 eval
的配置控制版本。相反,Hack 引入了 invariant
函数,您可以使用它向类型检查器提供您知道是正确但它无法弄清楚的信息。对 invariant
的调用总是在 运行 时检查,如果失败将抛出异常。
因此,在您的示例中,我不会进行任何额外的检查,因为 add_one("yes");
调用已经在 运行 时导致错误。