Как проверить, является ли аргумент смешанного типа вектором целых чисел в HackLang? - PullRequest
2 голосов
/ 24 февраля 2020

Функция ниже нереальна, только для демонстрации:

function acceptHackArray(mixed $x):someType {
    ....

    // Need to check is $x is a vector of integers
    $tmp = '$x is vector<int>';

    ...

    return something;
}

1 Ответ

3 голосов
/ 25 февраля 2020

Взгляните на библиотеку утверждений типа , созданную разработчиками HHVM, в частности реализацию VectorSpe c . На момент написания статьи, особенно для примитивов, нет ничего особенного: сначала проверка типа контейнера Traversable, затем итерация по массиву и утверждение содержимого в желаемом типе. Вы можете вырезать только соответствующий бит, используя is для обобщенных c типов для> = 3.28 (или is_vec для более старых версий, если вы не против точно vec):

function acceptHackArray(mixed $x): someType {
  invariant($x is Traversable<_>, '$x is not Traversable');
  $tmp = vec[];
  foreach($x as $v) {
    invariant($v is int, '$v is not int');
    $tmp[] = $v;
  }

  // $tmp is now vec<int>
  // ...
}
...