I have started learning hacklang today and now I am a bit stuck on shapes: http://docs.hhvm.com/manual/en/hack.shapes.php
I understand the concept of shapes and it seems really useful for me, but I can't understand why for example this code does not throw any error:
<?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();
The 'y' key is defined as integer, but when I pass a string, no error is shown. Thanks for your help :)
Actually executing Hack code doesn't necessarily typecheck everything. You need to actually run a separate tool to enforce the type system, as described in the docs article linked here. When you do that, you'll get an error that looks something like this, depending on the exact version of HHVM you have:
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
Modern versions of HHVM will also yell at you if you aren't running the typechecker; I suspect you're running an older version, before we realized this was a point of confusion -- sorry!
What actually happens when you run type-incorrect code is undefined behavior. The answer by Ed Cottrell is correct for the current version of HHVM -- we do the same thing PHP does to coerce types -- but keep in mind it's undefined behavior and may change in future versions without notice.
The interpreter will try to evaluate the 'y'
key as a number to do the calculation.
Example:
echo 4 * '6';
// prints 24
echo 4 * '6foo';
// prints 24
echo 'foo' * 42;
// prints 0, because floatval('foo') === 0
Your situation is like the third example. floatval('this should cause an fatal error?') === 0
, so the calculation is:
$a['x'] * $b['x'] + $a['y'] * $b['y'] === 3 * 4 + 0 * 4 === 12
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With