2015-10-08 2 views
3

Добрый день,HackLang от Facebook не является строгим

У меня проблема. Я хочу имитировать некоторые ошибки в хакланге.

<?hh 
namespace Exsys\HHVM; 

class HHVMFacade{ 

    private $vector = Vector {1,2,3}; 

    public function echoProduct() : Vector<string>{ 
     return $this->vector; 
    } 

    public function test(Vector<string> $vector) : void{ 
     var_dump($vector); 
    } 

} 

Функция echoProduct() возвращает вектор строк. Но private property $ vector - вектор целых чисел. Когда я вызываю echoFunction и возвращающее значение, используйте в качестве аргумента для функции test(). Я получаю

object(HH\Vector)#35357 (3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 

Почему? Я ожидаю некоторую ошибку, потому что типы несоответствуют.

ответ

8

Там две вещи в игре здесь:

  1. Дженерики не овеществленный, поэтому среда не имеет никакой информации о них. Это означает, что время выполнения проверяет только то, что вы возвращаете Vector.
  2. $this->vector сам не набирается. Это означает, что средство проверки типов (hh_client) рассматривает его как неизвестный тип. Неизвестные типы соответствуют всем, поэтому нет проблем с возвратом неизвестного типа, где ожидается Vector<string>.

    Это позволит вам постепенно вводить код. Всякий раз, когда тип неизвестен, проверяющий тип просто предполагает, что разработчик знает, что происходит.

Первое, что я хотел бы сделать, это изменить файл из частичного режима строгого режима, который просто включает в себя переход от <?hh к <?hh // strict. Это заставляет средство проверки типов жаловаться на любую информацию о отсутствующем типе (а также пару других вещей, например суперглобальных, и вы не можете вызывать не-Hack-код).

Это дает ошибку:

test.hh:6:13,19: Please add a type hint (Naming[2001]) 

Если затем ввести $vector в Vector<int> (private Vector<int> $vector), hh_client затем производит:

test.hh:9:16,28: Invalid return type (Typing[4110]) 
    test.hh:8:44,49: This is a string 
    test.hh:6:20,22: It is incompatible with an int 
    test.hh:8:44,49: Considering that this type argument is invariant with respect to Vector 

который является ошибка, которую вы ожидали. Вы также можете получить эту ошибку, просто добавив тип в $vector, не перейдя в строгий режим, хотя я предпочитаю писать свой Hack в самом сильном режиме, который поддерживает код.

С более поздними версиями HHVM средство проверки типов вызывается всякий раз, когда запускается код Hack (есть флаг INI, чтобы отключить его), поэтому причиной возникновения несоответствия типа также будет выполнение сбой кода.

+1

Можно ли использовать строгий режим для всех скриптов по умолчанию? – JaSHin

+0

Я тестирую скрипт в строгом режиме, без эффекта. Имущество объявляется как: private Вектор $ vector; Строгий режим включен и подтверждена ошибка ho :( – JaSHin

+0

@ user3249421 Вы используете 'hh_client' в своем коде? –