黑客类型转换 - 没有错误发生

时间:2018-01-10 13:29:36

标签: types hacklang

我正在学习Hack语言,我想创建一个像这样的特定类型:

    type Points = array<array<int, int>>;

然后我定义了这个函数:

    function printPoint(Points $point){
        var_dump($point[0], $point[1]);
    }

当我将此数组作为参数:[0,0]传递时,没有出现错误,输出为:

    int(0)
    int(0)

当我通过这个时:[[0,0],[0,0]],输出就像它应该:

    array(2) {
        [0]=>
            int(0)
        [1]=>
            int(0)
    }

    array(2) {
        [0]=>
            int(0)
        [1]=>
            int(0)
    }

我的问题是:为什么这样做? (我知道这不是通常的问题x))。为什么第一次测试中没有通知甚至致命类型错误?

谢谢;)

1 个答案:

答案 0 :(得分:3)

在运行时,泛型是erased。这意味着运行时只知道Points是一个数组,而不是什么类型的数组。

相反,您希望使用类型检查器 - hh_client - 来实现此目的。使用如下文件:

<?hh

type Points = array<array<int, int>>;

function printPoint(Points $point) {
  var_dump($point[0], $point[1]);
}

function test(): void {
  printPoint([0, 0]);
}

它会出现您期望的错误:

test.php:10:14,14: Invalid argument (Typing[4110])
  test.php:3:21,25: This is an array (used like a hashtable)
  test.php:10:15,15: It is incompatible with an int