Вывод типов

Вывод типов (Type Inference) - одная из мощных особенностей haXe, позволяющая программисту избегать постоянного ручного указания типов переменных и функций и при этом быть уверенным в безопасности типизации, которую за него делает компилятор.

Вывод Типа означает, что тип не только проверяется в программе, но и переносится во время типизации, поэтому он не обязательно должен быть определён явно. Например, локальная переменная может быть объявлена без типа (тогда она будет иметь тип Unknown) и в момент первого использования её тип будет установлен в соответствии с переданным.

===== Вывод типа при компиляции =====

В любом месте своей программы, вы можете использовать операцию type, чтобы узнать тип данного выражения. При компиляции, операция type будет убрана, и останется только выражение:

    var x : Int = type(0);
</div>

Этот код выведет Int при компиляции и откомпилирует ту же программу как будто type в коде не было.

Это может пригодиться чтобы быстро узнать тип, вместо поиска по классу или документации.

===== Выявление локальных переменных =====

Вывод типов позволяет всей программе быть строго типизированной без необходимости везде явно указывать типы. Это наиболее удобно для работы с локальными переменными - они, как правило, не нуждаются в явной типизации, а их типы будут выведены при первом доступе к ним для чтения или записи:

    var loc;
    type(loc); // print Unkown<0>
    loc = "hello";
    type(loc); // print String
</div>

===== Вывод типов функций =====

(Понятие "тип функции" объясняется здесь)

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

    function f( posx ) {
        // ....
    }
    // ...

    f(134);
    f(12.2); // Error : Float should be Int
</div>

В этом случае первый вызов f устанавливет тип posx в Int, и на втором вызове компиляция прерывается, потому что Float это не Int. Тем не менее, если мы поменяем местами два вызова функции f, её тип устанавливается в Float и может при этом принимать и Int.

В этом примере два вызова совсем рядом друг с другом, так что довольно легко понять и разрешить проблему, но в более крупных приложениях, решение таких проблем компиляции может быть довольно запутанным. Хотя всегда есть простой выход из ситуации - явно объявить тип функции, когда ошибка такого рода появляется. Тогда вызов, ответственный за проблему будет показан при компиляции.

===== Выбор пользователя =====

Использование вывода типов это вопрос выбора. Вы можете просто не указывать тип своих переменных и функций и позволить компилятору вывести типы за вас, или вы может указывать их всегда для большего контроля за процессом. Лучший подход возможно посередине, когда вы, добавляя некоторые типы для улучшения документации кода, при этом оставляете себе возможность писать некоторые функции быстро без типизации всего.

Во всех случаях, если вы не используете динамики (dynamics) (они будут представлены далее), ваша программа будет строго типизирована и неправильное использование будет обнаружено мгновенно при компиляции.