hacklang中的形状



我今天开始学习hacklang,现在我有点拘泥于形状:http://docs.hhvm.com/manual/en/hack.shapes.php

我理解形状的概念,它对我来说似乎真的很有用,但我不明白为什么这个代码没有抛出任何错误:

<?hh
type Point2D = shape('x' => int, 'y' => int);
function dotProduct(Point2D $a, Point2D $b): int {
    return $a['x'] * $b['x'] + $a['y'] * $b['y'];
}
function main_sse(): void {
    echo dotProduct(shape('x' => 3, 'y' => 'this should cause an fatal error?'), shape('x' => 4, 'y' => 4));
}
main_sse();

"y"键被定义为整数,但当我传递字符串时,不会显示任何错误。感谢您的帮助:)

实际上执行Hack代码并不一定要对所有内容进行类型检查。实际上,您需要运行一个单独的工具来强制执行类型系统,如链接到此处的文档文章中所述。当你这样做的时候,你会得到一个看起来像这样的错误,这取决于你拥有的HHVM的确切版本:

File "shapes.php", line 10, characters 19-23:
Invalid argument (Typing[4110])
File "shapes.php", line 3, characters 41-43:
This is an int
File "shapes.php", line 10, characters 42-76:
It is incompatible with a string

如果你没有运行类型检查器,现代版本的HHVM也会对你大喊大叫;我怀疑你运行的是旧版本,在我们意识到这是一个混乱点之前——对不起!

当您运行类型不正确的代码时,实际发生的是未定义的行为。Ed Cottrell的答案对于当前版本的HHVM来说是正确的——我们对类型的强制执行与PHP相同——但请记住,这是未定义的行为,在未来的版本中可能会更改,恕不另行通知。

解释器将尝试将'y'键求值为一个数字来进行计算。

示例:

echo 4 * '6';
// prints 24
echo 4 * '6foo';
// prints 24
echo 'foo' * 42;
// prints 0, because floatval('foo') === 0

你的情况就像第三个例子。floatval('this should cause an fatal error?') === 0,因此计算为:

$a['x'] * $b['x'] + $a['y'] * $b['y'] === 3 * 4 + 0 * 4 === 12

相关内容

  • 没有找到相关文章

最新更新